[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}
执行方法后...
相关文章
|
2月前
|
安全 Java 编译器
JDK 10中的局部变量类型推断:Java编程的简化与革新
JDK 10引入的局部变量类型推断通过`var`关键字简化了代码编写,提高了可读性。编译器根据初始化表达式自动推断变量类型,减少了冗长的类型声明。虽然带来了诸多优点,但也有一些限制,如只能用于局部变量声明,并需立即初始化。这一特性使Java更接近动态类型语言,增强了灵活性和易用性。
121 53
|
2月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
56 1
|
2月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
125 1
|
2月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
107 5
|
2月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
99 1
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
53 0
[Java]代理模式
|
2月前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
3月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
541 2
|
3月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
73 2
|
3月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
186 1