我试图通过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
这样的可变参数实际上只是T[]
在参数列表末尾的语法糖。因此,如果您准备了一个T[]
并将其作为参数交给该方法,它应该像预期的那样工作,请参阅Javassist教程,章节"varargs":
要在Javassist中嵌入的编译器编译的源代码中调用该方法,必须编写:
length(new int[] { 1, 2, 3 });
而不是使用varargs机制调用这个方法:
length(1, 2, 3);
顺便说一句,在你的情况下,你似乎需要一个Double[]
,从你的错误信息判断。