• 静态代理,实现同装饰
    • 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指定被代理方法