生成代理类,并写入硬盘:配置系统属性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动态代理类