用 javassist 解决 JDK 动态代理的缺陷

  • JDK动态代理的缺陷

    要求目标类必须实现接口,否则产生不了代理。有些场景下,目标类也要产生代理类但是木有实现接口,这个时间 Java 中有两个常用类库:1)javassist http://www.javassist.org/
  2) cglib 帮我们对木有实现接口的目标类产生代理

  • 添加依赖
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.25.0-GA</version>
</dependency
  • 新建类
public class BookDaoImpl3 {
  public void insert() {
    System.out.println("插入书籍");
  }
  public void update() {
    System.out.println("修改书籍");
  }
  public void del() {
    ////
    System.out.println("删除书籍");
  }
}
  • 测试代码
public class Test03 {
public static void main(String[] args) throws
InstantiationException, IllegalAccessException {
//租房子的人
BookDaoImpl3 target=new BookDaoImpl3();
//中介:基于 javassist 的动态代理,不要求实现代理
ProxyFactory factory=new ProxyFactory();
factory.setSuperclass(BookDaoImpl3.class);
factory.setHandler(new MethodHandler() {
@Override
public Object invoke(Object self, Method thisMethod,
Method proceed, Object[] args) throws Throwable {
//这里放置重复代码
Object ret=null;
try {
System.out.println("============================");
System.out.println("开启会话");
////
ret= thisMethod.invoke(target, args);//让不同代
码执行,不同代码再方法中
///
System.out.println("事务提交");
} catch (Exception e) {
System.out.println("事务回滚");
e.printStackTrace();
} finally {
System.out.println("关闭会话");
}
return ret;
}
});
Class clazz=factory.createClass(); BookDaoImpl3 proxy=(BookDaoImpl3) clazz.newInstance();
proxy.del();
proxy.update();
proxy.insert();
}
}
  • 不同点分析

      


用 CGLIB 解决 JDK 动态代理的缺陷

  • 添加依赖
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>
  • 测试
public class Test04 {
public static void main(String[] args) throws InstantiationException,
IllegalAccessException {
//租房子的人
BookDaoImpl3 target=new BookDaoImpl3();
//中介:基于 CGLIB 的动态代理,不要求实现代理
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(BookDaoImpl3.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
//这里放置重复代码
Object ret=null;
try {
System.out.println("============================");
System.out.println("开启会话");
////
ret= method.invoke(target, args);//让不同代码执行,不同代码再方法

///
System.out.println("事务提交");
} catch (Exception e) {
System.out.println("事务回滚");
e.printStackTrace();
} finally {
System.out.println("关闭会话");
}
return ret;
}
}); BookDaoImpl3 proxy=(BookDaoImpl3) enhancer.create();
proxy.del();
proxy.update();
proxy.insert();
}
}
  • 不同点分析



用javassist和CGLIB 解决JDK动态代理的缺陷的更多相关文章

  1. 面试造火箭系列,栽在了cglib和jdk动态代理

    "喂,你好,我是XX巴巴公司的技术面试官,请问你是张小帅吗".声音是从电话那头传来的 "是的,你好".小帅暗喜,大厂终于找上我了. "下面我们来进行一 ...

  2. 学习CGLIB与JDK动态代理的区别

    动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...

  3. Cglib 与 JDK动态代理的运行性能比较

    都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...

  4. Cglib 与 JDK动态代理

    作者:xiaolyuh 时间:2019/09/20 09:58 AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到: cglib是子类,private的方法照 ...

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

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

  6. CGlib和JDK动态代理

    一.CGlib动态代理     JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的1:字节码技术,其原理是通过字节 ...

  7. spring cglib 与 jdk 动态代理

    1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...

  8. java学习笔记(中级篇)—JDK动态代理

    一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...

  9. 有点深度的聊聊JDK动态代理

    在接触SpringAOP的时候,大家一定会被这神奇的功能所折服,想知道其中的奥秘,底层到底是如何实现的.于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式, ...

  10. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

随机推荐

  1. RxJava简要分析

    一:RxJava执行流程: RxJava简单使用 private final String tag = getClass().getSimpleName(); //数据源,被观察对象 Observab ...

  2. Tomcat 配置文件详解之-- server.xml

    一.背景 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat ...

  3. 安全漏洞之grafana-cve_2021_43798

    漏洞说明 一个可绕过用户登录进行任意文件读取的漏洞 环境搭建 我使用的是vulfocus提供的vulfocus/grafana-cve_2021_43798 ,由vulfocus后台统一管理 利用脚本 ...

  4. 89、des加密算法

    import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpe ...

  5. 读取本地xml或json等本地文件报错Failed to load file:///D:/xml/test.xml: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

    问题如上图: 原因及解析:在浏览器打开本地的html文件, 上面proxy中的url获取的就是一个本地文件, 协议是file://,如果是在服务器启动的话,则使用的是http或者https协议.出于安 ...

  6. 大二下学期开学java测试

    我们在2月13日下午进行了java测试(是一个新闻类型的题),通过这一个测试我进行了以下总结: 我对于javaweb的框架构建和加密密码,还有一些不同人物功能的实现,使得我在这次得考试中成绩不太理想. ...

  7. 【C学习笔记】day2-4 将三个数按从大到小输出

    #include <stdio.h> int main() { int max, min, mid; int a = 324, b = 435, c = 43; if (a > b) ...

  8. pgsql给表重命名

    alter table "pavement_damage_dtl_temp" rename to "pavement_damage_dtl"; 搜索 复制

  9. developer mode

    PS C:\Windows\system32> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersio ...

  10. vxe-table 合并单元格

    <vxe-table @cell-click="handleClickCell" :span-method="spanMethods" //自动合并单元格 ...