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