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

获取动态代理生成的.class文件的更多相关文章

  1. JAVA-获取 JDK 动态代理生成的 Class 文件

    可指定路径 import sun.misc.ProxyGenerator; import java.io.FileOutputStream; import java.io.IOException; i ...

  2. Mybatis-简单基于源码了解获取动态代理对象

    这是我们要测试的代码 OderDao就是我们要需要获取的对象. 首先我们根据传入的参数,进入SqlSessionFactoryBuilder 中的对应的build 方法,第一步创键XMLConfigB ...

  3. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  4. 通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis核心原理

    本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 pub ...

  5. 【SpringCloud原理】万字剖析OpenFeign之FeignClient动态代理生成源码

    年前的时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇.今天就继续接着剖析Sprin ...

  6. 输出cglib以及jdk动态代理产生的class文件

      --该设置用于输出jdk动态代理产生的类 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles&q ...

  7. java保存动态代理生成的类的class文件

    启动时加: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

  8. java-jdk动态代理生成的代理类源码

    import com.zkn.newlearn.gof.proxyhandler.PersonInter; import java.lang.reflect.InvocationHandler; im ...

  9. 一文读懂Java中的动态代理

    从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...

随机推荐

  1. vue-cli+webpack+router+vuex---之vuex使用

    有信心的可以去看官方的文档 vue 的官方文档有个显著的特点---代码粘贴不全 Vue中文站:cn.vuejs.org vue-router官方教程:router.vuejs.org/zh-cn vu ...

  2. Jmeter使用之-断言

    添加响应断言 ,一般下面这样选择断言的设置就可以了 个人习惯是直接从响应数据中直接复制正确的接口返回值到断言的测试模式中,如下          !!!但是这样复制的是有问题的 ,需要在测试模式中去掉 ...

  3. jsr-303 参数校验—自定义校验注解

    1.为什么要自定义? 通过上篇学习,了解到很多常用注解了,但是呢,总是有那么些需求....   2.案例分析(手机号格式) 2.1.需要验证的实体 Bean public class LoginVo ...

  4. Oracle单行函数

    一.尽管各个数据库都是支持sql语句的.可是每一个数据库也有每一个数据库所支持的操作函数,这些就是单行函数.假设想进行数据库开发的话.除了要回使用sql语句外,就是要多学习函数. 1.单行函数的分类: ...

  5. mac系统上mysql开启外网访问

    1.首先本地连到数据库在"mysql"库下把user表里User=root的那一行,把Hosts从"locahost"改成"%" 2.然后在 ...

  6. js之prototype 原型对象

    原型对象prototype可以这么理解,是该类的实例对象的模板,每个实例对象都是先复制一份该类的prototype,通过这个可以让类的实例拥有相同的功能   String.prototype.say= ...

  7. python爬取网易云音乐歌曲评论信息

    网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了“它比我还懂我的音乐喜好”.“小清新的界面设计”就是它独有的评论区了——————各种故事汇,各种金句频出.我们可以透过歌曲的评 ...

  8. 利用python脚本(re)抓取美空mm图片

    很久没有写博客了,这段时间一直在搞风控的东西,过段时间我把风控的内容整理整理发出来大家一起研究研究. 这两天抽空写了两个python爬虫脚本,一个使用re,一个使用xpath. 直接上代码——基于re ...

  9. 53.CSS---CSS水平垂直居中常见方法总结

    CSS水平垂直居中常见方法总结 1.元素水平居中 当然最好使的是: margin: 0 auto; 居中不好使的原因: 1.元素没有设置宽度,没有宽度怎么居中嘛! 2.设置了宽度依然不好使,你设置的是 ...

  10. Class_fourh_异常总结

    使用try,catch,finally.检查指点检查点是否错误: try里填入监测的内容 catch 小括号里放类型错误  判断try里出现的错误是哪一类错误 中括号里放 输出内容 在控制台上输出错误 ...