在 Java 中,代理机制(如 JDK 动态代理、CGLIB)是实现 AOP 和动态扩展的核心技术,但某些情况下对象无法被代理。以下是常见场景及原因:
final 类(仅限 CGLIB 代理)final 类无法被继承。 public final class FinalClass { // final 类无法被 CGLIB 代理
public void doSomething() {}
}final修饰类,或改用 JDK 动态代理(需目标类实现接口)final 或 privatefinal 方法无法被子类重写(CGLIB 代理失效)。private 方法无法被代理类访问。public class TargetClass {
public final void finalMethod() {} // 无法被代理
private void privateMethod() {} // 无法被代理
}final 或 private 修饰需代理的方法。public class NoInterfaceClass { // 未实现接口,无法被 JDK 代理
public void doAction() {}
}public class UtilityClass {
public static void staticMethod() {} // 静态方法无法被代理
}5. 目标对象为 null
Object target = null;
Proxy.newProxyInstance(..., target); // 抛出 NullPointerException6. 自调用(方法内部调用)
public class TargetClass {
public void methodA() {
methodB(); // 内部调用,不会触发代理
}
public void methodB() {}
}// 某些 JVM 核心类(如 String)或第三方封闭类
String str = "test";
Proxy.newProxyInstance(...); // 失败场景 | 代理类型 | 根本原因 |
|---|---|---|
final 类 | CGLIB | 无法继承目标类 |
final/private 方法 | CGLIB/JDK | 无法重写或访问方法 |
无接口的类 | JDK 动态代理 | 依赖接口生成代理 |
静态方法/构造方法 | 所有代理类型 | 代理仅作用于实例方法 |
自调用 | 所有代理类型 | 代理拦截仅限于外部调用 |
实际建议:
final。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。