使用Javassist插入代码调用getDeclaredMethod报找不到方法是什么原因
问题结论
这是Javassist的使用限制,不属于bug。
原因说明
Javassist内置的编译器对Java语法糖的支持存在局限性:
java.lang.Class#getDeclaredMethod的正式签名是Method getDeclaredMethod(String name, Class<?>... parameterTypes),第二个参数是可变长参数,Java原生编译器会自动将你写的boolean.class单个参数包装为Class[]数组,匹配到正确的方法签名。- 但Javassist的编译器处理插入代码时,默认不会自动处理可变长参数的语法糖转换,会直接去寻找参数列表为
(java.lang.String, java.lang.Class)的getDeclaredMethod方法,而Class类中不存在该签名的方法,因此抛出编译异常。
另外你修改的是java.lang.Thread这类核心类库类,Javassist解析核心类方法签名时的类加载器上下文和应用类加载器不同,也会放大这种语法支持的局限性。
解决方案
你只需要把可变参数显式声明为数组即可,修改插入的代码为:
java.lang.reflect.Method m = cls.getDeclaredMethod("valueOf", new Class[]{boolean.class});
内容的提问来源于stack exchange,提问作者clankill3r
相关产品推荐
相关产品推荐

