【java】说说有关jdk动态代理的那些事
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【java】说说有关jdk动态代理的那些事,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2755字,纯文字阅读大概需要4分钟。
内容图文
首先说下为什么要有动态代理呢?设计模式中,有一种模式叫代理模式,为什么要使用动态代理其实和为什么要使用设计模式一样,请读者自行思考。代理通常有静态代理,动态代理,其中静态代理是通过持有目标对象引用,然后对目标对象的方法进行增强,可以说是一种硬编码。jdk动态代理也需要持有目标对象的引用,在目标对象的方法的调用处进行增强,但这部分被封在处理器InvocationHandler中,通过反射机制生成Proxy实例,并传入处理器。----先来看下使用jdk动态代理实现方式:
import?java.lang.reflect.InvocationHandler;
import?java.lang.reflect.Method;
import?java.lang.reflect.Proxy;
public?class?DynamicProxy?implements?InvocationHandler {
??private?Object?target;
??public?DynamicProxy(Object?object){
???this.target = object;
??}
??@Override
??public?Object?invoke(Object?proxy, Method method,?Object[] args) throws Throwable {
??? System.out.println("before......");
? ??Object?result = method.invoke(target,args);
? ??System.out.println("after......");
? ??return?result;
??}
??@SuppressWarnings("unchecked")
??public?<T> T getProxy(){
? ??return?(T)Proxy.newProxyInstance(
???? ? ? target.getClass().getClassLoader(),
???? ? ? target.getClass().getInterfaces(),
? ? ? ? ??this);
??}
}
动态是相对于静态代理而言,jvm执行java类,需要先将class文件加载到jvm中,java是不允许在运行时修改class文件的,所以要想使用动态代理,需要动态生成class文件,加载到jvm中。通过设置系统属性,可以在运行时看到jdk动态生成的class文件。
System.getProperties().setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");在生成的类文件中,可以看到代理类继承自Proxy并实现了业务自定义的接口,下面是动态生成的代理类部分代码:
public?final?class?$Proxy0?extends?Proxy?implements?IHello{
?public?final?String?hello(String var1)?throws??{
? ? return?(String)super.h.invoke(this, m3,?new?Object[]{var1});
? }
? static?{
? ? m0 = Class.forName("java.lang.Object").getMethod("hashCode");
???m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
???m2 = Class.forName("java.lang.Object").getMethod("toString");
???m3 = Class.forName("com.proxy.IHello").getMethod("hello", Class.forName("java.lang.String"));
??}
}
可以看到jdk动态代理生成的代码,将目标对象接口的所有方法进行了代理,目标方法的执行就变成了处理器的invoke,在invoke中已经对目标对象中进行了增强。其实思路是朴素的,就好比你不想出去吃饭点了外卖,外卖就相当于你的代理,帮你送饭,但是吃饭还是需要你自己来,外卖平台已经知道你需要的增强就是有人送饭,然后动态给你指定一个外卖骑手......----
下面看下jdk动态代理为了生成代理类是如何操作的,首先查找或生成设计好的代理class:
由ProxyClassFactory在给定类加载器和接口数组的条件下,生成、定义、并返回代理class。
最后将class字节码加载到jvm,在生成代理类的函数中可以看到是否生成class文件的布尔标记saveGeneratedFiles:
jdk动态代理无处不在,大名鼎鼎的spring AOP默认使用的就是jdk动态代理,对于没有接口实现的类才使用cglib代理。
内容总结
以上是互联网集市为您收集整理的【java】说说有关jdk动态代理的那些事全部内容,希望文章能够帮你解决【java】说说有关jdk动态代理的那些事所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。