獲取動態代理生成的.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文件