获取动态代理生成的.class文件
生成代理类,并写入硬盘:配置系统属性sun.misc.ProxyGenerator.saveGeneratedFile为true,代理类生成时将自动将生成的代理类写入硬盘
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | packagecn.lut.dynamicproxy;importjava.lang.reflect.Proxy;publicclassJdkDymamicPoxy {    publicstaticvoidmain(String[] args) {        //生成$Proxy0的class文件        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");                IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(),                newClass[]{IHello.class} ,                 newHWInvocationHandler(newHello()));        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 | packagecn.lut.dynamicproxy;publicinterfaceIHello {    voidsayHello();} | 
实现类:
| 1 2 3 4 5 6 7 8 9 | packagecn.lut.dynamicproxy;publicclassHello implementsIHello {    publicvoidsayHello() {        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 | packagecn.lut.dynamicproxy;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;publicclassHWInvocationHandler implementsInvocationHandler {    //目标对象    privateObject target;        publicHWInvocationHandler(Object target){        this.target = target;    }        publicObject invoke(Object proxy, Method method, Object[] args) throwsThrowable {        System.out.println("------插入前置通知代码-------------");        //执行相应的目标方法        Object rs = method.invoke(target,args);        System.out.println("------插入后置处理代码-------------");        returnrs;    }} | 
生成代理类,并写入硬盘:配置系统属性sun.misc.ProxyGenerator.saveGeneratedFile为true,代理类生成时将自动将生成的代理类写入硬盘
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | packagecn.lut.dynamicproxy;importjava.lang.reflect.Proxy;publicclassJdkDymamicPoxy {    publicstaticvoidmain(String[] args) {        //生成$Proxy0的class文件        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");                IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(),                newClass[]{IHello.class} ,                 newHWInvocationHandler(newHello()));        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 | packagecn.lut.dynamicproxy;importjava.lang.reflect.Method;importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;publicclassCglibProxy implementsMethodInterceptor{       privateEnhancer enhancer = newEnhancer();            publicObject getProxy(Class<!--?--> clazz){        //设置需要创建子类的类        enhancer.setSuperclass(clazz);        enhancer.setCallback(this);        //通过字节码技术动态创建子类实例        returnenhancer.create();       }           //实现MethodInterceptor接口方法       publicObject intercept(Object obj, Method method, Object[] args,         MethodProxy proxy) throwsThrowable {        System.out.println("前置代理");        //通过代理类调用父类中的方法        Object result = proxy.invokeSuper(obj, args);        System.out.println("后置代理");        returnresult;       }      }   | 
3、具体实现类
添加System.in.read();,让程序一直运行,为生动.class文件作准备
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | packagecn.lut.dynamicproxy;importjava.io.IOException;publicclassDoCGLib {    publicstaticvoidmain(String[] args) throwsIOException {          CglibProxy proxy = newCglibProxy();          //通过生成子类的方式创建代理类           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) 代理类关联目标对象,实现目标对象实现的 ... 
随机推荐
- 补充:MySQL修改表
- C#获取邮件客户端保存的邮箱密码
			有时候邮件客户端记录了邮箱密码,但自己却忘记了,此时可以使用C#建立一个临时的"邮件服务器",截取密码: IPEndPoint ipEndPoint = new IPEndPoin ... 
- EasyUI combogrid/combobox过滤时限制只能选择现有项
			在使用EasyUI的combogrid时可以通过输入进行过滤,达到快速选择的目的,但是手工输入不存在的项也不会出错,结果提交到数据库后就会产生错误. 比如idField是int型的,输入的数据通过是检 ... 
- android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】
			android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ... 
- socket  编程中。 服务端用到多线程
			客户端连接服务端之后, 服务端会生成与客户端交换信息的socket. 在服务端实现多线程: 为每个连接创建一个线程进行信息交换. import threading from socket import ... 
- linux 下的clock_gettime() 获取时间函数
			#include <time.h> int clock_gettime(clockid_t clk_id, struct timespec* tp); 可以根据需要,获取不同要求的精确时间 ... 
- ES6 函数
			函数参数的扩展 默认参数 基本用法 function fn(name,age=17){ console.log(name+","+age); } fn("Amy" ... 
- VB调用C# dll
			cd C:\Windows\Microsoft.NET\Framework\v4.0.30319注册regasm myTest.dll /tlb:myTest.tlb 
- [js]ajax-异源请求jsonp
			参考: http://www.cnblogs.com/whatisfantasy/p/6237713.html http://www.cnblogs.com/freely/p/6690804.html ... 
- linux----------安装Supervisor是用Python开发的一套通用的进程管理程序
			1.linux环境必须安装 python 2.yum install python-setuptools 3.获取supervisor包 wget https://pypi.python.org/pa ... 
