获取动态代理生成的.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动态代理类

加载中...\

转载于:https://www.cnblogs.com/zhongchang/p/8689041.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值