使用 Varargs

问题描述

我正在尝试通过 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[]