1. 程式人生 > >獲取動態代理生成的.class文件

獲取動態代理生成的.class文件

clas htm 插入 www. syntax 父類 系統 實現類 error

生成代理類,並寫入硬盤:配置系統屬性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文件