JDK动态代理生成.class文件和cglib动态代理生成.class文件

一、JDK动态代理生成.class文件

接口:

  1. package cn.lut.dynamicproxy;  
  2.   
  3. public interface IHello {  
  4.     void sayHello();  
  5. }  
package cn.lut.dynamicproxy;

public interface IHello {
	void sayHello();
}
实现类:

  1. package cn.lut.dynamicproxy;  
  2.   
  3. public class Hello implements IHello {  
  4.   
  5.     public void sayHello() {  
  6.         System.out.println("Hello,world!");  
  7.     }  
  8.   
  9. }  
package cn.lut.dynamicproxy;

public class Hello implements IHello {

	public void sayHello() {
		System.out.println("Hello,world!");
	}

}
InvoctionHandler实现:

  1. package cn.lut.dynamicproxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class HWInvocationHandler implements InvocationHandler {  
  7.     //目标对象  
  8.     private Object target;  
  9.       
  10.     public HWInvocationHandler(Object target){  
  11.         this.target = target;  
  12.     }  
  13.       
  14.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
  15.         System.out.println("------插入前置通知代码-------------");  
  16.         //执行相应的目标方法  
  17.         Object rs = method.invoke(target,args);  
  18.         System.out.println("------插入后置处理代码-------------");  
  19.         return rs;  
  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. package cn.lut.dynamicproxy;  
  2.   
  3. import java.lang.reflect.Proxy;  
  4.   
  5. public class JdkDymamicPoxy {  
  6.     public static void main(String[] args) {  
  7.         //生成$Proxy0的class文件  
  8.         System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles""true");  
  9.           
  10.         IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(),  
  11.                 new Class[]{IHello.class} ,   
  12.                 new HWInvocationHandler(new Hello()));  
  13.         iHello.sayHello();  
  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. <dependency>  
  2.       <groupId>cglib</groupId>  
  3.       <artifactId>cglib</artifactId>  
  4.       <version>3.1</version>  
  5.   </dependency>/  
<dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.1</version>
  </dependency>/
2、生成代理类
  1. package cn.lut.dynamicproxy;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import net.sf.cglib.proxy.Enhancer;  
  6. import net.sf.cglib.proxy.MethodInterceptor;  
  7. import net.sf.cglib.proxy.MethodProxy;  
  8.   
  9. public class CglibProxy implements MethodInterceptor{    
  10.      private Enhancer enhancer = new Enhancer();    
  11.        
  12.      public Object getProxy(Class<?> clazz){    
  13.       //设置需要创建子类的类    
  14.       enhancer.setSuperclass(clazz);    
  15.       enhancer.setCallback(this);    
  16.       //通过字节码技术动态创建子类实例    
  17.       return enhancer.create();    
  18.      }   
  19.        
  20.      //实现MethodInterceptor接口方法    
  21.      public Object intercept(Object obj, Method method, Object[] args,    
  22.        MethodProxy proxy) throws Throwable {    
  23.       System.out.println("前置代理");    
  24.       //通过代理类调用父类中的方法    
  25.       Object result = proxy.invokeSuper(obj, args);    
  26.       System.out.println("后置代理");    
  27.       return result;    
  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. package cn.lut.dynamicproxy;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. public class DoCGLib {  
  6.     public static void main(String[] args) throws IOException {    
  7.         CglibProxy proxy = new CglibProxy();    
  8.         //通过生成子类的方式创建代理类    
  9.          Hello proxyImp = (Hello)proxy.getProxy(Hello.class);    
  10.          proxyImp.sayHello();   
  11.          System.in.read();  
  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动态代理类



参考:

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值