在 Java 中,Proxy(代理)通常指 JDK 动态代理(java.lang.reflect.Proxy),用来在运行时为接口创建代理对象,从而在方法调用前后插入额外逻辑(如日志、事务、权限等)。
下面从 是什么 → 怎么用 → 示例 → 注意事项 讲清楚。
java.lang.reflect.ProxyInvocationHandler结构关系:
接口 A
↑
代理对象(Proxy)
↑
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.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(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;
}
}
import java.lang.reflect.Proxy;
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 MyInvocationHandler(userService)
);
proxy.save("Tom");
}
}
方法执行前
保存用户:Tom
方法执行后
Proxy.newProxyInstance(
ClassLoader loader, // 类加载器
Class<?>[] interfaces, // 要代理的接口
InvocationHandler h // 调用处理器
)
✅ AOP(切面编程)
✅ 事务管理
✅ 日志记录
✅ 权限校验
✅ RPC 框架(如 Feign)
❌ 不能代理类,只能代理接口
❌ 性能比直接调用略低
✅ 无需第三方依赖
如果你要代理类,需要用:
@Transactional
public void method() {}
Spring 背后就是:
Java Proxy = 给接口创建“包装对象”,在方法调用前后做增强
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。