一、JDK动态代理生成.class文件
接口:
package cn.lut.dynamicproxy;
public interface IHello {
void sayHello();
}
实现类:
- package cn.lut.dynamicproxy;
- public class Hello implements IHello {
- public void sayHello() {
- System.out.println("Hello,world!");
- }
- }
package cn.lut.dynamicproxy;
public class Hello implements IHello {
public void sayHello() {
System.out.println("Hello,world!");
}
}
InvoctionHandler实现:
- 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;
- }
- }
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,代理类生成时将自动将生成的代理类写入硬盘
- 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();
- }
- }
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工程直接添加依赖:
- <dependency>
- <groupId>cglib</groupId>
- <artifactId>cglib</artifactId>
- <version>3.1</version>
- </dependency>/
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>/
2、生成代理类
- 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;
- }
- }
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文件作准备
- 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();
- }
- }
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动态代理类
参考:
http://blog.csdn.net/chenzhiqin20/article/details/50900439
http://blog.csdn.net/yakoo5/article/details/9099133/
http://www.cnblogs.com/MOBIN/p/5597215.html
http://stackoverflow.com/questions/35146746/write-java-object-into-class-file/35171336#35171336
原文地址:http://blog.csdn.net/zhao1991abc/article/details/52926620