在 Java 中,**Proxy(代理)**通常指两种东西,初学者容易混淆:
下面从最该先学的 JDK 动态代理 + 代理模式入门,循序渐进。
代理模式:
在不修改原对象代码的情况下,通过“代理对象”来控制对原对象的访问。
InvocationHandlerpublic interface InvocationHandler {
Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
public interface UserService {
void sayHello();
}
public class UserServiceImpl implements UserService {
public void sayHello() {
System.out.println("Hello");
}
}
import java.lang.reflect.*;
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
this.target = target;
}
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;
}
}
import java.lang.reflect.*;
public class Main {
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.sayHello();
}
}
✅ 输出:
前置逻辑
Hello
后置逻辑
⚠️ 只能代理接口
❌ 不能代理类
✅ 必须:
interface + implements
如果你要代理普通类,需要:
✅ 非常适合:
Spring 的 @Transactional、@Cacheable 底层就是代理。
❌ “代理就是反射”
✅ 代理 用了反射,但不等于反射
❌ “代理能增强任何类”
✅ JDK 代理只能增强接口
如果你愿意,我可以:
你更想从哪一块继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。