diff --git "a/\346\240\241\346\213\233\351\235\242\350\257\225/Spring\346\272\220\347\240\201\350\247\243\346\236\220/JDK\345\222\214CGLib\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\222\214\345\214\272\345\210\253" "b/\346\240\241\346\213\233\351\235\242\350\257\225/Spring\346\272\220\347\240\201\350\247\243\346\236\220/JDK\345\222\214CGLib\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\222\214\345\214\272\345\210\253" new file mode 100644 index 0000000000000000000000000000000000000000..c2a62381374afbca711aa2579f3ee704be5ae634 --- /dev/null +++ "b/\346\240\241\346\213\233\351\235\242\350\257\225/Spring\346\272\220\347\240\201\350\247\243\346\236\220/JDK\345\222\214CGLib\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\347\216\260\345\222\214\345\214\272\345\210\253" @@ -0,0 +1,52 @@ +# JDK和CGLib动态代理实现和区别 + +## JDK动态代理实现 + +IHelloService接口 +``` +public interface IHelloService { + void sayHello(); +} +``` + +HelloServiceImpl实现类 + +``` +public class HelloServiceImpl implements IHelloService { + @Override + public void sayHello() { + System.out.println("Jdk say Hello"); + } +} +``` + +JdkDynamicProxy实现InvocationHandler接口类 +``` +public class JdkDynamicProxy implements InvocationHandler { + + private Object targetObject; + + public Object newProxyInstance(Object targetObject) { + //将目标对象传入进行代理 + this.targetObject = targetObject; + //返回代理对象 + return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); + } + + @Override + public Object invoke(Object proxyObject, Method method, Object[] args) throws Throwable { + System.out.println("JdkDynamicProxy," + method.getName() + "方法,执行之前"); + return method.invoke(this.targetObject, args); + } +} +``` + +在该类除了覆写invoke()方法,还封装了一个生成代理类的方法,该方法可以不放置在此的。上述代码的关键是Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler) 方法,该方法会根据指定的参数动态创建代理对象。三个参数的意义如下: + +loader,指定代理对象的类加载器; +interfaces,代理对象需要实现的接口,可以同时指定多个接口; +handler,方法调用的实际处理者,代理对象的方法调用都会转发到这里(*注意1)。 +newProxyInstance()会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法。动态代理神奇的地方就是: + +代理对象是在程序运行时产生的,而不是编译期; +对代理对象的所有接口方法调用都会转发到InvocationHandler.invoke()方法,在invoke()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能等。 \ No newline at end of file