第一种:JDK这种方式是基于代理类必须实现某一接口,关键类:InvocationHandler 接口和Proxy类。
核心Code:
public class JDKProxy implements InvocationHandler {Object target;public Object bind(Object o){this.target = o;return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(args[0].toString());return method.invoke(target,args);}
}
第二种:动态代理时采用类继承的方式。核心类:MethodInterceptor
核心Code:
public class CGLibProxy {Object target;public CGLibProxy() {}public Object bind(Object o){this.target = o;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Methodmethod, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("CGLib");return methodProxy.invokeSuper(o,objects);}});return enhancer.create();}
}