From 6eeca9d9ac66ca3ba1e50990476e821a08c28d1e Mon Sep 17 00:00:00 2001 From: createmango <9640793+createmango@user.noreply.gitee.com> Date: Wed, 15 Sep 2021 08:58:25 +0000 Subject: [PATCH] =?UTF-8?q?add=20=E6=A0=A1=E6=8B=9B=E9=9D=A2=E8=AF=95/Spri?= =?UTF-8?q?ng=E6=BA=90=E7=A0=81=E8=A7=A3=E6=9E=90/JDK=E5=92=8CCGLib?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E4=BB=A3=E7=90=86=E5=AE=9E=E7=8E=B0=E5=92=8C?= =?UTF-8?q?=E5=8C=BA=E5=88=AB.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\260\345\222\214\345\214\272\345\210\253" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 "\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" 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 0000000..c2a6238 --- /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 -- Gitee