`
买切糕的猴子
  • 浏览: 23461 次
社区版块
存档分类
最新评论

JDK-动态代理

    博客分类:
  • java
阅读更多
1、JDK动态代理原理
2、JDK动态代理模块结构
 
一、JDK动态代理原理
     使用过JDK动态代理的都知道需要借助InvocationHandler和Proxy来实现代理,但是其原理是啥呢?最近研究了一下,这里做个小小的总结。
     先来看一个小的动态代理demo
从demo类图可以看出,有一个接口UserDao和它的实现类,然后定义了我们的MyInvocationHandler,它必须实现JDK的InvocationHandler接口,通过invoke方法来对目标对象target添加增强的逻辑代码,从而达到切面增强的目的。同时我们的MyInvocationHandler还提供了getProxy()方法用于获取目标对象的代理,最后通过调用代理对象的方法完成业务逻辑和增强逻辑。具体的代码如下:
    
public class ProxyTest {
	public static void main(String[] args) {
		UserDao dao = new UserDaoImpl();
		MyInvocationHandler h = new MyInvocationHandler(dao);
		UserDao proxy =  (UserDao) h.getProxy();
		proxy.add();
	}
}
 
public interface UserDao {
	void add();
}
 
public class UserDaoImpl implements UserDao{

	/* (non-Javadoc)
	 * @see example.spring.boot.demo.proxy.UserDao#add()
	 */
	@Override
	public void add() {
		System.out.println("add user-----------");
	}

}
 
public class MyInvocationHandler implements InvocationHandler{
	
	private Object target;
	
	/**
	 * @param target
	 */
	public MyInvocationHandler(Object target) {
		super();
		this.target = target;
	}



	/* (non-Javadoc)
	 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("befor---------------");
		Object ret = method.invoke(target, args);
		System.out.println("after---------------");
		return ret;
	}
	
	
	public Object getProxy(){
		return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
	}
}
 
JDK动态代理流程如下图:
其实要想了解JDK动态代理的原理的关键就是理解它是如何动态生成代理对象,并且融合方法执行器的。下面来看看JDK的源码类图
     本文使用的是JDK1.8.45,1.8以后的动态和之前的有所不同,不同之处在于它使用了1.8才有的功能接口,但是并没有改变其原有的实现原理,只是用功能接口在外包了一层用于支持1.8的新特性。
     JDK通过Proxy的newProxyInstance方法产生代理对象Class对象,然后通过Constructor的newInstance方法把代理对象和InvocationHanlder结合在一起,然后返回。我们把返回的对象反编译后可以看到方法里的实现改为了直接调用invocationHandler的invoke方法。
     至于如何产生带对象的可以查看ProxyClassFactory的apply方法,它通过ProxyGenerator的generateProxyClass方法生成代理对象的字节码,然后经过调用本地方法 defineClass0加载字节码并生成代理对象的Class对象返回。

 

   值得一说的是这里会把已经生成过的代理对象缓存到WeakCache,相比之前的版本,在代理这块提高了一定的性能。
  • 大小: 38.3 KB
  • 大小: 44.7 KB
  • 大小: 25.8 KB
分享到:
评论

相关推荐

    java-jdk1.6-jdk-6u45-windows-x64.zip

    2. 动态代理:引入了`java.lang.reflect.Proxy`类,使得动态创建代理对象成为可能,便于实现AOP(面向切面编程)。 3. NIO.2:Java 7引入了NIO.2,但1.6版本已经包含了一些改进,如更好的文件系统访问API,异步I/O...

    jdk1.6--jdk-6u45-windows-i586.exe.zip

    6. **动态代理**:动态代理提供了在运行时创建代理对象的能力,用于实现接口的动态方法调用。 7. **NIO.2**:Java 6引入了新的I/O API,提供了更好的异步I/O操作和文件系统访问。 8. **改进的JDBC**:对JDBC API...

    jdk-6u45-linux-i586

    加入动态代理,允许在运行时创建代理类,增强了面向切面编程的能力。 JDK 6u45作为更新版,可能包含安全修复、性能优化以及对已知问题的改进。对于开发者而言,保持JDK版本的最新是非常重要的,因为它可以确保程序...

    jdk-6u45-linux-x64.bin

    3. **动态代理**:Java 1.6引入了对动态代理的增强,允许在运行时创建接口的代理实现,这在AOP(面向切面编程)和事件处理中非常有用。 4. **增强的I/O和NIO**:JDK 1.6扩展了Java的I/O API,引入了NIO.2,提供了一...

    jdk-6u43-windows-x64 64位

    4. **动态代理**:JDK 6引入了动态代理类的实现,允许在运行时创建代理类,增强了面向切面编程(AOP)的能力。 5. **Swing增强**:Swing组件库得到了大量改进,包括更好的外观和感觉,以及新的组件和事件处理机制。...

    jdk-6u26-windows-i586.rar

    - **动态代理类**:允许在运行时创建实现了指定接口的新类,这在实现AOP(面向切面编程)或事件处理中非常有用。 - **改进的XML处理**:增强了Java API for XML Processing (JAXP),支持XPath 2.0和XSLT 2.0,使...

    JDK 1.6 64位(jdk-6u45-windows-x64(1.6 64))

    4. **动态代理**:Java代理机制在1.6版本中得到扩展,支持动态生成代理类,使得在运行时创建和修改代理更加便捷。 5. **改进的XML处理**:JDK 1.6对DOM、SAX和StAX等XML解析API进行了改进,处理XML文档的速度和效率...

    jdk-8u301-windows-x64.exe

    8. **Java动态代理(Dynamic Proxies)**: JDK 8提供了更强大的动态代理机制,允许在运行时创建接口的实现类,这对于AOP(面向切面编程)和测试框架非常有用。 9. **Nashorn JavaScript引擎**: JDK 8引入了Nashorn ...

    jdk-6u45-windows-x86_x64.rar

    - **动态代理类**:允许在运行时创建实现一组给定接口的新类。 - **NIO.2(New IO)**:提供了更高级别的文件系统操作,如异步I/O和路径操作。 - **改进的XML处理**:包括对StAX API的支持,使得XML处理更为高效...

    jdk-6u45-windows-x64.rar

    此外,JDK 6还引入了新的并发工具类、NIO.2文件系统接口、动态代理等增强功能,提高了开发效率和代码质量。 总之,"jdk-6u45-windows-x64.rar"是Java 6 64位版本的安装包,适用于Windows 64位系统,其安装与配置是...

    jdk-6u41-linux-x64 64位

    2. **动态代理**:Java语言层面的支持,允许在运行时创建代理类,以实现给定接口并提供额外的行为。 3. **改进的I/O流**:NIO(非阻塞I/O)在JDK 6中得到了增强,增加了文件通道和选择器等功能,提升了I/O操作的...

    jdk-6u41-windows-x64.exe文件.zip

    3. **动态代理**:增加了对动态代理的支持,允许在运行时创建接口实现类,增强了反射功能。 4. **改进的脚本语言支持**:JDK6开始支持JavaScript和其他脚本语言,通过JSR 223(Scripting for the Java Platform)...

    jdk-18_windows-x64_bin.zip

    7. **Java管理扩展(JMX)**:允许创建和管理Java应用程序的管理代理,进行远程监控和管理。 8. **Java应用启动器(java.exe)**:用于启动Java应用程序,根据类路径和主类名执行程序。 9. **Java Native ...

    jdk-6-windows-i586

    3. **JDK 6新特性**:在JDK 6中,引入了多个新特性,例如增强的Swing组件、动态代理类、JSR 223脚本引擎支持、改进的XML处理、Java内存模型的增强等。这些特性极大地提高了开发效率和代码的可读性。 4. **JDK版本...

    jdk-6u32-linux-x64.zip

    6. **动态代理**:允许在运行时创建接口的实现。 7. **XML处理API升级**:包括DOM、SAX和StAX的改进。 8. **JMX(Java Management Extensions)**:用于管理和监控Java应用程序。 **安装和配置JDK 6的步骤:** 1. ...

    JDK动态代理_JDK动态代理

    ### JDK动态代理详解 #### 一、引言 在软件工程中,代理模式是一种常见的设计模式,它通过为一个对象提供一个替代品或占位符来控制对这个对象的访问。这种模式通常用于添加额外的功能(例如日志记录、事务管理等)...

    JDK-1.6-Windows-32位 官方

    3. **动态代理**:JDK 1.6引入了`java.lang.reflect.Proxy`类,允许开发者创建动态代理对象,方便实现回调和AOP(面向切面编程)。 4. **NIO.2**:新I/O API,也称为NIO.2,提供了更现代、更易用的文件系统操作接口...

    jdk-6u45-linux-x64.zip

    在编程实践中,JDK 6引入了许多重要的改进和特性,比如泛型的改进、枚举类型、注解、动态代理、改进的内存管理以及增强的I/O和网络编程API等。这些都极大地提高了开发效率和代码质量。 总之,"jdk-6u45-linux-x64....

    jdk-6u45-windows-i586

    此版本引入了多项增强功能,如改进的Swing组件、动态代理、增强的枚举类型支持以及XML处理的优化等。 JDK 1.6 x86是专为32位Windows系统设计的,这意味着它可以在32位版本的Windows XP、Vista、7、8甚至是10上运行...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

Global site tag (gtag.js) - Google Analytics