这篇文章主要介绍了基于JDK动态代理原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于JDK动态代理原理是什么文章都会有所收获,下面我们一起来看看吧。如果我们要为target类创建一个【JDK动态代理对象】,那么我们必须要传入如下三个核心参数加载target类的类加载器target类实现的接口InvocationHandler为什么必须要这三个参数呢?之前使用动态代理的时候都是直接按接口要求传这三个参数,但从来没想过为什么?下面仔细去探究一下【JDK动态代理】的核心其实是借助【Proxy.newProxyInstance(ClassLoader loader,Class>[] interfaces,InvocationHandler h)】方法,去创建的动态代理对象,我们这里也使用这个方法去创建一个简单的【动态代理对象】以便于理解他的核心原理。实现Subject接口,并实现接口相关方法定义一个工厂类,该工厂类用于为target对象生产代理对象该工厂类借助Proxy.newProxyInstance
来为目标对象创建代理对象该测试类会将内存中的动态代理对象保存到磁盘上,以便于我们后续分析生成的动态代理类的具体结构在上面一步中我们使用将动态生成的代理保存到了磁盘上,下面我们就具体看看生成的代理类长什么样可以看到代理类【继承了Proxy类】,并且【实现了目标接口Subject】,覆写了接口中的【每一个方法】这也说明了为什么JDK代理需要实现接口,因为Java是单继承的,既然代理类继承了Proxy类那么就无法再继承其他类了在代理类中将我们的【目标接口Subject】的【所有方法(包括object父类的方法)】都以【静态属性的形式】保存了起来(主要是为了方便后面的【反射调用】)在调用动态代理对象的某个方法时(比如:调用doSomething方法),实质上是调用的【Proxy类】的【h属性】的invoke方法所以我们要重点去看看这个【Proxy.h】到底是个什么鬼?其实他就是创建代理对象是我们传入的【InvocationHandler】在上面的第三点中我们看到,执行代理对象的方法的时候其实质是调用的【super.h.invoke方法】也就是【Proxy.h.invoke方法】,那么我们仔细看看【Proxy.h】到底是什么鬼下面的源代码我做了一些删减,只留下了最核心的部分通过下面代码我们就明确了使用【newProxyInstance】方法创建代理对象时所做的几件事情首先通过【目标接口】 + 【类加载器】创建一个Proxy类的【Class对象】然后通过这个【Class对象】获取到他的有参构造器,并且传入我们自定义的【InvocationHandler】作为构造函数参数,并且通过反射的方式调用有参构造器创建一个【Proxy对象】在【Proxy的有参构造器】中,会将传入的【InvocationHandler】保存到 【h属性】上(方便后面的supper.h.invoke调用)代理对象创建完毕现在再来看上面抛出的三个问题!为什么创建代理对象时需要传入如下三个参数:加载target类的类加载器target类实现的接口InvocationHandler因为动态代理类也是类,我们普通的类是从【磁盘上的.class文件(也可以是其他地方,比如网络上)】里加载而来,而动态代理类则是在【运行过程中动态生成的类】。那么既然是类那么他就一定要【被类加载器加载后】才能被我们的【Java虚拟机】识别。所以我们会传入【加载target类的类加载器】,用该类加载器来加载【动态生成的代理类】为啥要传入【target类实现的接口】呢?直接【继承目标类】不行吗?肯定不行从上面的【动态生成的代理类的结构】来看,代理类继承了Proxy类,由于【Java是单继承】的,所以无法再通过继承的方式来继承【目标类】了。所以动态代理类需要【实现目标接口】,来重写接口的方法从【动态生成的代理类的结构】可以看出,我们传入的InvocationHandler
最终会被作为一个属性保存到Proxy对象的【h属性】上并且【动态代理对象】会覆写【目标接口的所有方法】,在方法中会使用 supper.h.invoke
的方式调用InvocationHandler的invoke方法,所以我们需要传入InvocationHandler
动态代理的每个方法调用都会先走InvocationHandler.invoke()
方法关于“基于JDK动态代免费云主机域名理原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“基于JDK动态代理原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
这篇文章主要介绍“怎么使用C#WPF实现动态3D光照效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C#WPF实现动态3D光照效果”文章能帮助大家解决问题。接下来想动态实现光照效果,即如下图所示看到这个滚动条…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。