Proxy.getInvocationHandler()仅适用于JDK动态代理实例,需先用proxy instanceof Proxy或Proxy.isProxyClass()校验,否则抛IllegalArgumentException;它返回InvocationHandler而非目标对象,获取target需手动从handler中提取。

可以直接调用 Proxy.getInvocationHandler(proxyInstance) 获取代理对象的调用处理器,但前提是该对象必须是通过 java.lang.reflect.Proxy 创建的标准动态代理实例;否则会抛出 IllegalArgumentException。
确认对象是合法的 Proxy 实例
Java 的 Proxy.getInvocationHandler() 仅支持由 Proxy.newProxyInstance() 创建的代理对象。若传入普通对象、CGLIB 代理、JDK 外部框架(如 Spring AOP 默认使用 CGLIB)生成的代理,都会失败。
- 检查方式:用
Proxy.isProxyClass(proxyInstance.getClass())判断类是否为 Proxy 类 - 更稳妥的做法:先用
proxyInstance instanceof java.lang.reflect.Proxy初步判断(注意这是运行时类型检查,非编译期) - 示例:
Object proxy = Proxy.newProxyInstance(...); if (proxy instanceof Proxy) { InvocationHandler handler = Proxy.getInvocationHandler(proxy); // ✅ 安全获取 }
正确调用 getInvocationHandler() 并处理异常
该方法不返回 null,但会在参数非法时立即抛出 IllegalArgumentException。建议显式捕获并给出清晰提示。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 典型用法:
try { InvocationHandler handler = Proxy.getInvocationHandler(proxyObj); System.out.println("Handler: " + handler); } catch (IllegalArgumentException e) { System.err.println("不是 JDK 动态代理实例:" + e.getMessage()); } - 常见错误场景:传入 null、非 Proxy 对象、或被包装过(如 Spring 的 Advised 接口代理)
区分 JDK Proxy 与其它代理技术
Spring AOP、MyBatis、Hibernate 等框架默认可能使用 CGLIB 或字节码增强,其代理对象不是 java.lang.reflect.Proxy 子类,因此不能直接用此方法。
立即学习“Java免费学习笔记(深入)”;
- JDK Proxy 特征:代理类名形如
$ProxyN,且继承自Proxy - CGLIB 代理特征:类名形如
UserService$$EnhancerBySpringCGLIB$$...,继承自目标类,非Proxy子类 - 如需统一获取处理器,Spring 提供
Advised接口:((Advised) proxy).getAdvisors()或getTargetSource().getTarget()
从 InvocationHandler 中提取原始目标对象(常见需求)
很多场景下,开发者真正想要的是代理背后的真实对象(target)。这取决于你写的 InvocationHandler 是否保存了 target 引用。
- 标准写法中通常会持有 target,例如:
class MyHandler implements InvocationHandler { private final Object target; MyHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { return m.invoke(target, args); // 转发给真实对象 } } - 获取 target 需手动实现:将 handler 强转为你自己的类型,再调用 getter 方法
- 不能指望
Proxy.getInvocationHandler()自动返回 target —— 它只返回 handler 实例本身

















