- 静态代理,实现同装饰
-
class TankTimeProxy implements Movable {
Movable m;
@Override
public void move(){
m.move();
}
}
- 动态代理,Proxy调asm生成代理类
-
Tank tank = new Tank();
Movable m = (Movable)Proxy.newProxyInstance(Tank.class.getClassLoader()),
new Class[]{Movable.class},
new Hander(tank)
);
class Handler implements InvocationHandler {
Tank tank;
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
return method.invoke(tank, args);
}
}
// 动态代理, CGLIB调asm,由于是继承,所以final类不能代理
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Tank.class);
enhancer.setCallback(new TimeMethodInterceptor());
Tank tank = (Tank)enhancer.create();
tank.move();
class TimeMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) {
return methodProxy.invokeSuper(o, objects);
}
}
// Spring AOP: aspect指定代理类, pointcut指定被代理方法