关于该设计模式需要解决的问题:
1、JAVA动态代理解决了什么问题?其实用场景是什么?
2、了解,如何使用,怎样将动态代理用于实际项目?
3、其原理是什么?底层代码是如何实现的?
问题1解答:
其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。使用场景有:日志与业务分离,在方法真正执行前先做一些判断或者执行后做一些处理等等,都是动态代理的实用场景。
问题2解答:
接口A,接口A的实现类B,类C继承InvocationHandler,实现invoke方法,该方法有参数(Object proxy, Method method, Object[] args) throws Throwable
代理类是由Proxy.getProxyClass()返回的类,Proxy.newProxyInstance()则返回代理类的实例
proxy是代理类的实例对象
method:在代理实例上执行的方法
args:在代理实例上执行method方法的参数
问题3解答:
重点在getProxyClass方法
1、对代理类实现的接口做一些安全性检查:
实现的接口数最大长度为65535=2^16-1个;
接口是否对参数classload可见
Class object是否为接口
接口是否重复
2、 /** maps a class loader to the proxy class cache for that loader */
private static Map<ClassLoader, Map<List<String>, Object>> loaderToCache
= new WeakHashMap<>();
从loadToCach获取类装载器为对象关键词对应的缓存表,如果该缓存不存在则新建一个HashMap,放入缓存表,该HashMap存放的是该代理类实现的接口列表以及生成的动态代理类对象的引用,当代理类正在被创建的时候,它将通过<接口名字列表,pendingGenerationMarker>来进行保存,设置pendingGenerationMarker标志是为了通知后来请求创建该接口名字列表的动态代理类实例该实例正在被创建,请等待其创建完成。待创建完成之后会notifyAll所有在等待的线程
3、创建动态代理类对象:
首先需要确定代理类所在的包,如果接口列表中的所有接口都是public的,该动态代理类的包则置空为空字符串,否则需要判断所有的接口列表是否在同一个包下,如果不是则会抛出IllegalArgumentException异常,如果是,接口所在的包也就是代理类所在的包;
然后确定代理类的名称,名称采用$ProxyN的方式,N的值为nextUniqueNumber,该变量是同步的,由nextUniqueNumberLock监视
动态代理的动态代码由 byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces);来生成,该代码sun没有公开;
动态类的定义由 proxyClass = defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length);来定义,包括:类所在的加载器,动态代理类类名,动态代理的动态代码,
4、更新缓存表,如果成功则将代理类的类对象引用(new WeakReference<Class<?>>(proxyClass))更新至缓存表,否则则清除缓存表中的关键字(接口列表)对象
感觉也没有很好的解答开头提出的问题,有更好解答的或者有不对的地方欢迎大家指出,一起讨论!
相关推荐
java动态代理的机制分析,以及相应的拓展。有详细的代码和实例加以分析。
java 动态代理机制综合分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
java动态代理的分析与实现。有详细的代码实例,适合学习。
详细介绍了Java的动态代理机制 是学习Java反射与动态代理的不错资料
本文通过分析Java动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java动态代理运作过程,希望能帮助读者加深对Java动态代理的理解和应用。本文的标签...
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
java 动态代理Proxy应用和底层源码分析.pdf
Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。
java中动态代理的分析与实现。有详细的代码综合实例,适合学习。
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 代理模式是常用的java设计模式,他的特征是代理类与委托类有...
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
Java动态代理文档解释+案例代码实现。充分的体现了企业化思想。此案例使用动态代理实现了某个业务对象的性能分析。可商用!设置100积分谢谢。整理不易
Java JDK代理、CGLIB、AspectJ代理分析比较
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
java中反射机制的分析,动态代理的分析与实现。有详细的代码实例,适合学习。
Java Spring代理模式AOP-IOC分析
java中反射机制的分析,动态代理的分析与实现。有详细的代码实例,适合学习。
java动态代理主要有2种,Jdk动态代理、Cglib动态代理,本文主要讲解Jdk动态代理的使用、运行机制、以及源码分析。当spring没有手动开启Cglib动态代理,即:或@EnableAspectJAutoProxy(proxyTargetClass = true),...