获取动态代理生成的.class文件
生成代理类,并写入硬盘:配置系统属性sun.misc.ProxyGenerator.saveGeneratedFile为true,代理类生成时将自动将生成的代理类写入硬盘
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package cn.lut.dynamicproxy;import java.lang.reflect.Proxy;public class JdkDymamicPoxy { public static void main(String[] args) { //生成$Proxy0的class文件 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[]{IHello.class} , new HWInvocationHandler(new Hello())); iHello.sayHello(); }} |
报Exception in thread "main" java.lang.InternalError: I/O exception saving generated file:java.io.FileNotFoundException: com\sun\proxy\$Proxy0.class (系统找不到指定的路径。)异常时,在项目根目录下增加com/sun/proxy目录。

二、cglib动态代理生成.class文件
1、添加cglib依赖jar:cglib-3.1.jar、asm-3.1.jar
maven工程直接添加依赖:
|
1
2
3
4
5
|
<dependency> <groupid>cglib</groupid> cglib</artifactid> <version>3.1</version> </dependency>/ |
JDK动态代理生成.class文件和cglib动态代理生成.class文件
一、JDK动态代理生成.class文件
接口:
|
1
2
3
4
5
|
package cn.lut.dynamicproxy;public interface IHello { void sayHello();} |
实现类:
|
1
2
3
4
5
6
7
8
9
|
package cn.lut.dynamicproxy;public class Hello implements IHello { public void sayHello() { System.out.println("Hello,world!"); }} |
InvoctionHandler实现:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package cn.lut.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class HWInvocationHandler implements InvocationHandler { //目标对象 private Object target; public HWInvocationHandler(Object target){ this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("------插入前置通知代码-------------"); //执行相应的目标方法 Object rs = method.invoke(target,args); System.out.println("------插入后置处理代码-------------"); return rs; }} |
生成代理类,并写入硬盘:配置系统属性sun.misc.ProxyGenerator.saveGeneratedFile为true,代理类生成时将自动将生成的代理类写入硬盘
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package cn.lut.dynamicproxy;import java.lang.reflect.Proxy;public class JdkDymamicPoxy { public static void main(String[] args) { //生成$Proxy0的class文件 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[]{IHello.class} , new HWInvocationHandler(new Hello())); iHello.sayHello(); }} |
报Exception in thread "main" java.lang.InternalError: I/O exception saving generated file:java.io.FileNotFoundException: com\sun\proxy\$Proxy0.class (系统找不到指定的路径。)异常时,在项目根目录下增加com/sun/proxy目录。

二、cglib动态代理生成.class文件
1、添加cglib依赖jar:cglib-3.1.jar、asm-3.1.jar
maven工程直接添加依赖:
|
1
2
3
4
5
|
<dependency> <groupid>cglib</groupid> cglib</artifactid> <version>3.1</version> </dependency>/ |
2、生成代理类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package cn.lut.dynamicproxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{ private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<!--?--> clazz){ //设置需要创建子类的类 enhancer.setSuperclass(clazz); enhancer.setCallback(this); //通过字节码技术动态创建子类实例 return enhancer.create(); } //实现MethodInterceptor接口方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("前置代理"); //通过代理类调用父类中的方法 Object result = proxy.invokeSuper(obj, args); System.out.println("后置代理"); return result; } } |
3、具体实现类
添加System.in.read();,让程序一直运行,为生动.class文件作准备
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package cn.lut.dynamicproxy;import java.io.IOException;public class DoCGLib { public static void main(String[] args) throws IOException { CglibProxy proxy = new CglibProxy(); //通过生成子类的方式创建代理类 Hello proxyImp = (Hello)proxy.getProxy(Hello.class); proxyImp.sayHello(); System.in.read(); } } |
4、运行HSDB工具
1)、打开cmd窗口,运行命令:java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
2)、点击file菜单下第一项

弹出


3)、打开任务管理器,找到当前运行java程序的进程号pid,输入到上图的文本框中,点击ok弹出



4)、点击工具(tools)菜单下的第一项Class Browser。弹出


5)、输入包名cn.lut.dynamic回车.


6)、点击Create .class File,在HSDB工具运行目录下下生产cglib动态代理类


获取动态代理生成的.class文件的更多相关文章
- JAVA-获取 JDK 动态代理生成的 Class 文件
可指定路径 import sun.misc.ProxyGenerator; import java.io.FileOutputStream; import java.io.IOException; i ...
- Mybatis-简单基于源码了解获取动态代理对象
这是我们要测试的代码 OderDao就是我们要需要获取的对象. 首先我们根据传入的参数,进入SqlSessionFactoryBuilder 中的对应的build 方法,第一步创键XMLConfigB ...
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- 通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis核心原理
本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 pub ...
- 【SpringCloud原理】万字剖析OpenFeign之FeignClient动态代理生成源码
年前的时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇.今天就继续接着剖析Sprin ...
- 输出cglib以及jdk动态代理产生的class文件
--该设置用于输出jdk动态代理产生的类 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles&q ...
- java保存动态代理生成的类的class文件
启动时加: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true
- java-jdk动态代理生成的代理类源码
import com.zkn.newlearn.gof.proxyhandler.PersonInter; import java.lang.reflect.InvocationHandler; im ...
- 一文读懂Java中的动态代理
从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...
随机推荐
- java面试基础题------》Java 中List、Set、Map异同点
借鉴地址:http://blog.csdn.net/speedme/article/details/22398395 几句喜欢的话,拷贝下来: 世间上本来没有集合,(只有数组参考C语言)但有人想要,所 ...
- pytorch-MNIST数据模型测试
用pytorch搭建一个DNN网络,主要目的是熟悉pytorch的使用 """ test Function """ import torch ...
- 将lits集合转化为树状结构
一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...
- poj3278
#include<iostream> #define MAX 100001 int john,cow; int queue[MAX]; int vis[MAX]; int ans; voi ...
- 解决web资源跨域请求问题
参考地址: http://my.oschina.net/lichaoqiang/blog/317823 在浏览器请求中,出现跨域访问资源的问题,我们肯定会遇到.如果跨域请求被阻止,有可能导致css.j ...
- qt opencv编译错误 /usr/local/lib/libopencv_imgcodecs.so.3.1:-1: error: error adding symbols: DSO missing from command line
转载自:http://tbfungeek.github.io/2016/03/05/Opencv-%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87 ...
- mac系统上mysql开启外网访问
1.首先本地连到数据库在"mysql"库下把user表里User=root的那一行,把Hosts从"locahost"改成"%" 2.然后在 ...
- [LeetCode] 系统刷题3_Binary search
可以参考 [LeetCode] questions conclusion_ Binary Search
- 关于Java8 Stream流的利与弊 Java初学者,大神勿喷
题目需求: 1:第一个队伍只要名字为3个字成员的姓名,存储到新集合 2:第一个队伍筛选之后只要前3人:存储到一个新集合 3:第2个队伍只要姓张的成员姓名:存储到一个新集合 4:第2个队伍不要前2人,存 ...
- QCon2019全球软件开发大会广州站即将来袭
QCon广州2019|全球软件开发大会 会议时间:2019-05-25 08:00至 2019-05-28 18:00结束 会议地点: 广州 广州万富希尔顿酒店 中国广州市白云区云城东路515-5 ...