动态代理的实现(Proxy类的实现)

1. Proxy类的

newProxyInstance
的实现:

1. 获得代理类,这个代理类有点类似与Proxy类的子类。这个代理类有一个接受

Proxy(InvocationHandler h) 的构造函数。

public
static Object newProxyInstance(ClassLoader loader,

Class<?>[] interfaces,

InvocationHandler h){

Class<?> cl = getProxyClass(loader, interfaces);

Constructor cons = cl.getConstructor(constructorParams);

return cons.newInstance(new Object[] { h });

}

2. 获得代理类的 Proxy(InvocationHandler h) 构造方法。

3. 通过Constructor cons构造方法,获得代理类的实例。

2. 下面的重点就是getProxyClass是如何构造代理类的?

public
static Class<?> getProxyClass(ClassLoader loader,

Class<?>... interfaces)

byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

proxyName, interfaces);

proxyClass = defineClass0(loader, proxyName,
proxyClassFile, 0, proxyClassFile.length);

return proxyClass;

}

上面的实现是简化后的核心代码。可以第一步:使用代理类生成器(ProxyGenerator)生成代理类文件(class文件)。第二步:用 classloader来加载该类。

三:ProxyGenerator类的 generateProxyClass 方法

ProxyGenerator gen = new ProxyGenerator(name, interfaces);

final
byte[] classFile = gen.generateClassFile();

generateClassFile这个方法的实现大致是:生成一个继承自

/** name of the superclass of proxy classes */

private
final
static String superclassName = "java/lang/reflect/Proxy";

类的子类。实现每一个interfaces,实现的机制是:直接调用

/** name of field for storing a proxy instance‘s invocation handler */

private
final
static String handlerFieldName = "h";

的invoke方法。

注意,这里的实现策略,是直接生成二进制文件,而不是生成java文件,然后在编译生成class文件,而是直接生成class文件。

时间: 2024-11-09 08:58:48

动态代理的实现(Proxy类的实现)的相关文章

Java中动态代理技术生成的类与原始类的区别 (转)

用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等. 这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我

深度模拟java动态代理实现机制系类之三

这里的内容就比较复杂了,要实现的是对任意的接口,对任意指定的方法,以及对任意指定的代理类型进行代理,就更真实的模拟出java虚拟机的动态代理机制 罗列一下这里涉及的类.接口之间的关系,方便大家学习.1.InvocationHandler接口,用来处理指定的方法,即对特定方法的代理,处理的具体实现交由子类实现2.TimeHandler类,实现了InvocationHandler接口的子类,具体的代理实现是进行时间代理3.Proxy类,用于产生代理类的类4.Moveable接口,举例过程中各类要实现

探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

Mybatis的Mapper接口UserMapper 1 package com.safin.Mapper; 2 3 import com.safin.Pojo.User; 4 5 import java.util.List; 6 7 public interface UserMapper { 8 int insertUser(User user); 9 User getUser(Long id); 10 List<User> findUser(String userName); 11 } 我

动态代理之JDK Proxy浅析

反射:运行时动态实例化任何一个类. 看此文章前至少对JAVA反射有一定了解... Jdk动态代理的实现就是使用了反射机制,关键代码在Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h).可以看到该方法中的最后一个参数InvocationHandler,这是动态代理实现的另一个关键点. 直接上代码,接口.目标类.调用处理类: /** * @author longe * 目标类实现的

深度模拟java动态代理实现机制系类之二

这次我们要实现的是对任意接口,任意的方法进行特定的代理 这里不一样的只有Proxy类,要实现对所有方法进行代理,那么重点就在于获得接口的所有方法 import java.io.File;import java.io.FileWriter;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader; import jav

深度模拟java动态代理实现机制系类之一

上一篇博客是最基本的动态代理原理的实现,因为其固定了接口,固定了代理方法,以及固定了代理的类型,接下来的博客系类将一步步渐入深度介绍java的动态代理的实现原理 ****************************************************************************首先补充一下“java代理”的相关知识,静态代理的实现包括两种方式,一是聚合,另一种是继承.聚合是指通过接口,调用其实现类的具体方法:比如接口i,含有方法run(); 类A 实现了接口i

java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口. invoke()在代理实例上处理方法调用并返回结果.在与方法关联的代理

Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术

目标对象的所有接口方法 package test.spring.service; public interface PersonService { public String getPersonName(Integer id); public void save(String name); } 目标对象 package test.spring.service.impl; import test.spring.service.PersonService; //代理对象实现目标对象所有接口 publ

类加载与动态代理

动态代理 所谓动态,就是在运行期间生成代理类.不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害. 而我现在的目标是弄清楚jdk如何实现动态代理. 阅读Proxy类的源码能够看清大体流程: 1.我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息. 2.有了这些接口的类型信息,就可以通过反射得到所有的方法的信息 3.这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文

Java中的动态代理以及Proxy类的偷瞄

动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包下,主要涉及到两个类. (1)接口InvocationHandler:该接口中仅定义了一个方法. Object invoke(Object obj, Method method, Object[] args); 在实际使用时,第一个参数obj一般指代理类,method是被代理的方法,args为该方法