[Java]轻松掌握JDK和CGlib代理的使用技巧,让你的Java程序性能更卓越!

简介: [Java]轻松掌握JDK和CGlib代理的使用技巧,让你的Java程序性能更卓越!

JDK代理与CGlib代理

是什么

JDK代理:JDK代理是一种基于接口的动态代理,它实现了被代理对象所实现的接口,可以在运行时通过反射的方式来生成代理对象。

CGlib代理:CGlib代理是一种基于类的动态代理,它通过生成被代理对象的子类来实现代理。因此,被代理对象不需要实现接口。

为什么

使用代理模式的主要目的是为了在不修改原始类的前提下,为其添加一些额外的功能。在实际开发中,我们经常需要在业务逻辑执行前后,增加一些日志记录、权限校验、事务管理等功能,这些功能与业务逻辑关系不大,但是又必须加入到业务逻辑中。这时就可以使用代理模式来解决这个问题。

怎么用

JDK代理
  1. 定义一个接口:
public interface UserService {
    void save(User user);
}
  1. 实现接口:
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        System.out.println("保存用户信息:" + user);
    }
}
  1. 创建代理类,实现InvocationHandler接口:
public class UserServiceProxy implements InvocationHandler {
    // 被代理对象
    private Object target;
    public UserServiceProxy(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行方法前...");
        Object result = method.invoke(target, args);
        System.out.println("执行方法后...");
        return result;
    }
}
  1. 测试:
public static void main(String[] args) {
    UserServiceImpl userService = new UserServiceImpl();
    UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            new UserServiceProxy(userService));
    proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...
CGlib代理
  1. 定义一个类:
public class UserService {
    public void save(User user) {
        System.out.println("保存用户信息:" + user);
    }
}
  1. 创建代理类,继承MethodInterceptor接口:
public class UserServiceProxy implements MethodInterceptor {
    // 被代理对象
    private Object target;
    public UserServiceProxy(Object target) {
        this.target = target;
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("执行方法前...");
        Object result = method.invoke(target, args);
        System.out.println("执行方法后...");
        return result;
    }
}
  1. 测试:
public static void main(String[] args) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(UserService.class);
    enhancer.setCallback(new UserServiceProxy(new UserService()));
    UserService proxy = (UserService) enhancer.create();
    proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...
相关文章
|
19天前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
30 1
|
10天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
18 4
|
8天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
11 1
|
13天前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
14 0
[Java]静态代理与动态代理(基于JDK1.8)
|
1月前
|
缓存 Java Maven
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
如何解决Java项目中因JDK版本不匹配导致的编译错误,包括修改`pom.xml`文件、调整项目结构、设置Maven和JDK版本,以及清理缓存和重启IDEA。
38 1
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
|
14天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
15 2
|
25天前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
17 1
|
25天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
20 1
|
30天前
|
缓存 Java 数据库连接
使用 NCache 将 Java 微服务扩展到极致性能
使用 NCache 将 Java 微服务扩展到极致性能
26 8
|
26天前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
19 1