parent
159854552f
commit
febdcd66fe
@ -0,0 +1,5 @@
|
||||
package proxy;
|
||||
|
||||
public interface Movable {
|
||||
void move();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package proxy;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class Tank implements Movable{
|
||||
|
||||
@Override
|
||||
public void move(){
|
||||
System.out.println("tank is moving...");
|
||||
try {
|
||||
Thread.sleep(new Random().nextInt(10000));
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package proxy.cglib;
|
||||
|
||||
import net.sf.cglib.proxy.Enhancer;
|
||||
import net.sf.cglib.proxy.MethodInterceptor;
|
||||
import net.sf.cglib.proxy.MethodProxy;
|
||||
import proxy.Tank;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Enhancer enhancer = new Enhancer();
|
||||
enhancer.setSuperclass(Tank.class);
|
||||
enhancer.setCallback(new MethodInterceptor() {
|
||||
@Override
|
||||
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
|
||||
System.out.println("before...");
|
||||
Object result = methodProxy.invokeSuper(o, objects);
|
||||
System.out.println("end...");
|
||||
return result;
|
||||
}
|
||||
});
|
||||
Tank tank = (Tank) enhancer.create();
|
||||
tank.move();
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package proxy.dynamic;
|
||||
|
||||
import proxy.Movable;
|
||||
import proxy.Tank;
|
||||
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
|
||||
public class MainV1 {
|
||||
public static void main(String[] args) {
|
||||
Tank tank = new Tank();
|
||||
Movable m = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new InvocationHandler() {
|
||||
@Override
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
System.out.println("method " + method.getName() + " start...");
|
||||
Object o = method.invoke(tank, args);
|
||||
System.out.println("method " + method.getName() + " end...");
|
||||
return o;
|
||||
}
|
||||
});
|
||||
m.move();
|
||||
System.out.println("-------------------------------------------------------------------------------------------------------");
|
||||
Movable m2 = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new TankLogHandler(tank));
|
||||
m2.move();
|
||||
}
|
||||
}
|
||||
|
||||
class TankLogHandler implements InvocationHandler{
|
||||
private Tank tank;
|
||||
|
||||
public TankLogHandler(Tank tank) {
|
||||
this.tank = tank;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
System.out.println("tank start...");
|
||||
Object o = method.invoke(tank, args);
|
||||
System.out.println("tank stop...");
|
||||
return o;
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package proxy.st;
|
||||
|
||||
import proxy.Tank;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
new TankTimeProxy(new TankLogProxy(new Tank())).move();
|
||||
// log start -> tank moving -> log end -> tank move time
|
||||
new TankLogProxy(new TankTimeProxy(new Tank())).move();
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package proxy.st;
|
||||
|
||||
import proxy.Movable;
|
||||
|
||||
public class TankLogProxy implements Movable {
|
||||
private Movable m;
|
||||
|
||||
public TankLogProxy(Movable m) {
|
||||
this.m = m;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void move() {
|
||||
System.out.println("tank start moving...");
|
||||
m.move();
|
||||
System.out.println("tank end moving...");
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package proxy.st;
|
||||
|
||||
import proxy.Movable;
|
||||
|
||||
/*
|
||||
* 坦克move时间代理 move前后进行一些处理
|
||||
* */
|
||||
public class TankTimeProxy implements Movable {
|
||||
private Movable m;
|
||||
|
||||
public TankTimeProxy(Movable m) {
|
||||
this.m = m;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void move() {
|
||||
long start = System.currentTimeMillis();
|
||||
m.move();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println("move time: " + (end-start));
|
||||
}
|
||||
}
|
Loading…
Reference in new issue