动态代理实现思路
实现功能;通过Proxy的newProxyInstance返回代理对象
1.声明一段源码(动态产生代理)
2.编译源码(JDK Compiler API),产生新的类(代理类)
3.将这个类load到内存当中,产生一个新的对象(代理对象)
4.return 代理对象
动态代理实现思路 实现功能;通过Proxy的newProxyInstance返回代理对象 1.声明一段源码(动态产生代理) 2.编译源码(JDK Compiler API),产生新的类(代理类) 3.将这个类load到内存当中,产生一个新的对象(代理对象) 4.return 代理对象
JDK动态代理概念:在代理类和被代理类之间增加了InvocationHandler接口和Proxy类来动态的产生代理,通过上节案例了解JDK动态代理可以对实现某些接口的任意类的任意方法产生任意的代理。
通过案例模拟JDK动态代理的内部实现:
实现Proxy.newProxyInstance(被代理类的类加载器,被代理类实现的接口,事务处理器对象)的功能————思路:创建一个类,提供一个静态方法,该类的作用和Proxy类的作用相同 (这里关键是如何通过该方法动态产生代理,以支持实现了某些接口的任意类任意方法产生代理)。
动态代理实现思路:
【a】声明一段源码:该源码就是在Proxy类中定义一个字符串,该字符串的值就是静态代理TimeProxy类的源码(这里在它的基础上进行改造)。
手动创建Proxy类,并提供newInstance的静态方法(模拟JDK动态代理的Proxy调用静态方法newInstance()),并在该方法中声明一个字符串该字符串的值是静态代理类TimeProxy(源码)的所有,如下图(Windows下的换行符:"\r\n"。)。
这里给代理类的文件名换成JDK生成动态代理的文件名$Proxy0。
注意:由于源码中已经有引号了,所以可以通过转义引号\"\"来代替引号。


通过JDK动态产生代理类获取名字方式:因为该方式返回的就是代理类,代理对象.getClass.getName(),结果可以看到JDK产生动态代理的名字就是$Proxy0。


【b】编译源码(编译时使用JDK Compiler API),编译成功后就会产生新的类(该类就是代理类)
编译的方式:一般先生成一个java文件,然后对该java文件进行编译。
首先定义文件的路径,文件路径的值一般取当前应用所在的路径(当前路径获取方式:System.getProperty("user.dir"),这样方便进行编译。如下图,测试输出。也可以把该项目放在指定目录下,在后面拼接指定路径加类名。



根据这个路径生成一个java文件。

接下来需要把该源码生成到java文件当中,通过commons-io包下的FileUtils类可以快速的对文件进行读写删除等等操作,这里使用writeStringToFile(File对象,Stirng对象)(jre1.6不支持编译,这里改成jdk)

这样在运行测试程序时,就会生成一个$Proxy0.java文件放到指定目录下,可以在Navigator视图下的bin目录下查看到。

因为实现的目标是想对任意对象任意方法产生任意的代理,所以该方法还需要改造,也就是源码中代理类。


由于是要动态产生代理,所以静态代理源码中实现接口的方法也需要通过传进来的参数来获取。所以定义一个String用来获取方法。

还需要把方法替换成methodStr,如图

测试:

动态代理实现思路 实现功能;通过Proxy的newProxyInstance返回代理对象 1.声明一段源码(动态产生代理) 2.编译源码(JDK Compiler API),产生新的类(代理类) 3.将这个类load到内存当中,产生一个新的对象(代理对象) 4.return 代理对象
自己实现JDK动态代理的思路: 实现功能:通过Proxy的newProxyInstance()返回代理对象 1. 声明一段源码(动态产生代理,Java的文件名要注意--$Proxy0) 2. 编译源码(JDK Compiler API),产生新的类(代理类) 3. 将这个类load到内存当中,产生一个新的对象(代理对象) 4. return代理对象 设置换行符:String rt = "\r\n"; 获取文件路径:String fileName = System.getProperty("user.dir")+"/bin/com/imooc/proxy/$Proxy.java";
本节知识点:
获取当前文件路径的方法:System.getProperty("user.dir")
获取当前系统时间的方法:System.currentTimeMillis();
Navigate 视图的使用。
jre 和 jdk 环境的装换。
commons-io FileUtils 的使用
快捷键 ctrl + shift + o 调整文件缩进
动态代理实现思路