Java 中的 Proxy(代理) 通常有两种常见含义,入门时建议先分清:
下面以 JDK 动态代理 为主,带你从 0 入门。
核心思想:
在不修改原类代码的情况下,增强或控制方法调用
典型场景:
JDK 动态代理必须满足条件:
✅ 被代理类必须实现接口
涉及三个关键角色:
| 角色 | 说明 |
|---|---|
| 接口 | 定义业务方法 |
| 被代理类 | 真实实现 |
| InvocationHandler | 代理逻辑 |
public interface UserService {
void save(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void save(String name) {
System.out.println("保存用户:" + name);
}
}
import java.lang.reflect.*;
public class LogHandler implements InvocationHandler {
private Object target; // 被代理对象
public LogHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before:" + method.getName());
Object result = method.invoke(target, args);
System.out.println("after:" + method.getName());
return result;
}
}
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
new Class[]{UserService.class},
new LogHandler(userService)
);
proxy.save("张三");
}
}
before:save
保存用户:张三
after:save
✅ 你没有改 UserServiceImpl,但方法被“增强”了
Proxy.newProxyInstance(
ClassLoader loader, // 类加载器
Class<?>[] interfaces, // 代理接口
InvocationHandler h // 代理逻辑
)
❌ 代理类不能强转成实现类
UserServiceImpl s = (UserServiceImpl) proxy; // 错误
❌ 只能代理接口,不能代理普通类(JDK 限制)
✅ 想代理类 → 用 CGLIB
Spring AOP 底层其实就是:
你学会 JDK Proxy,就懂了 AOP 一半原理。
如果你愿意,我可以:
你想从哪个角度继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。