zoukankan      html  css  js  c++  java
  • 获取动态代理生成的.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: comsunproxy$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: comsunproxy$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动态代理类

    加载中...

  • 相关阅读:
    php 网络图片转base64
    uniapp微信小程序拒绝授权后,重新调起授权页
    uniapp获取用户信息 getuserinfo
    基于JSP和Mybatis框架技术的应用总结
    Java第16周作业集
    Java第15周作业集
    Java第14周作业集
    Java第13周作业集
    软件工程结课作业
    Java第13次作业--邮箱的正则表达式
  • 原文地址:https://www.cnblogs.com/zhongchang/p/8689041.html
Copyright © 2011-2022 走看看