前置知识: Java

反射与动态代理

00:00
1 min Advanced 2026/6/14

Java反射与动态代理详解:JDK Proxy、CGLib。

1. 反射

Class<?> clazz = Class.forName("com.example.User");
Method method = clazz.getMethod("setName", String.class);
Object instance = clazz.getDeclaredConstructor().newInstance();
method.invoke(instance, "Alice");

2. JDK 动态代理

interface UserService {
    String getName(int id);
}

UserService proxy = (UserService) Proxy.newProxyInstance(
    UserService.class.getClassLoader(),
    new Class[]{UserService.class},
    (obj, method, args) -> {
        System.out.println("Before: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After: " + method.getName());
        return result;
    }
);

限制:只能代理接口。

3. CGLib 动态代理

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("Before");
    Object result = proxy.invokeSuper(obj, args);
    System.out.println("After");
    return result;
});
UserServiceImpl proxy = (UserServiceImpl) enhancer.create();

优势:可以代理类(通过生成子类)。

4. 对比

特性JDK ProxyCGLib
代理目标接口
性能较快较慢(生成
依赖JDK 内置第三方
final 方法不适用无法代理

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式