问题描述
我正在尝试通过 javassist 调用 java.util.Arrays.asList(..)
。但得到以下异常。
javassist.CannotCompileException: [source error] asList(java.lang.Double,java.lang.Double,java.lang.Double) not found in java.util.Arrays
我已将修饰符设置为:
m.setModifiers(m.getModifiers() | javassist.Modifier.VaraRGS);
即便如此,我也遇到了异常。
也就是说,Javassist 不明白我在调用:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
它正在明确地寻找如下方法:
public static <T> List<T> asList(T a,Ta1,Ta2) {
return new ArrayList<>(a);
}
如何让 Javassist 识别出正在调用带有可变参数的方法?
解决方法
@javaseeker,你为什么不回应我的评论并提供更多上下文信息?您告诉我们您希望调用哪个方法,但不显示实际准备和执行调用的代码。这没有帮助。
无论如何,我会冒一个有根据的猜测:可能您尝试使用多个参数调用目标方法,因为它会从普通 Java 源代码中调用。但是像 T... a
这样的 varargs 参数实际上只是参数列表末尾 T[]
的语法糖。因此,如果您准备一个 T[]
并将其作为参数传递给方法,它应该按预期工作,另请参阅 Javassist tutorial,chapter "varargs":
要在Javassist内嵌的编译器编译的源代码中调用这个方法,必须写:
length(new int[] { 1,2,3 });
而不是使用可变参数机制调用此方法:
length(1,3);
顺便说一句,从您的错误消息来看,您似乎需要一个 Double[]
。