java动态代理必须基于接口,因为proxy机制通过实现接口生成代理类(如$proxy0 implements yourinterface),而非继承具体类,故目标类须实现至少一个接口才能被代理。

Java 动态代理通过接口实现,核心是 java.lang.reflect.Proxy 类和 InvocationHandler 接口。它只能代理接口(不能代理具体类),运行时动态生成一个实现了指定接口的代理类,并将所有方法调用转给 InvocationHandler 处理。
为什么必须基于接口?
因为 Proxy 的机制依赖于“实现接口”来生成字节码。JVM 在运行时用 ProxyGenerator 生成一个新类,形如 $Proxy0 implements YourInterface。这个类没有继承你的真实类,而是统一委托给 InvocationHandler。所以目标对象本身必须至少实现一个接口,代理才能“挂载”上去。
基本步骤(三要素缺一不可)
-
定义一个接口:比如
UserService,包含login()、getUser()等方法 -
提供一个真实实现类:比如
UserServiceImpl实现了UserService -
写一个 InvocationHandler 实现类:重写
invoke(Object proxy, Method method, Object[] args),在里面处理前置/后置逻辑,再用反射调用真实对象的方法 - 用 Proxy.newProxyInstance() 创建代理实例:传入类加载器、接口数组、InvocationHandler 实例
关键代码示例
假设接口是:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
public interface UserService {
String login(String username, String password);
}
真实实现:
public class UserServiceImpl implements UserService {
public String login(String u, String p) {
return "Welcome, " + u;
}
}
代理处理器:
public class LogHandler implements InvocationHandler {
private final Object target;
public LogHandler(Object target) { this.target = target; }
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;
}
}
创建代理:
UserService impl = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
impl.getClass().getClassLoader(),
impl.getClass().getInterfaces(),
new LogHandler(impl)
);
proxy.login("alice", "123"); // 触发 LogHandler.invoke
注意几个常见误区
- 代理对象的类型是接口类型,不是实现类类型 —— 不能强转成
UserServiceImpl -
Proxy.newProxyInstance第二个参数是Class>[],必须传接口类对象,比如new Class[]{UserService.class} - 如果实现类没实现任何接口,就无法用 JDK 动态代理;此时可考虑 CGLIB(基于子类),但那是另一套机制
- 代理对象调用
toString()、hashCode()、equals()也会进入invoke,需留意默认行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










