1

我试图使用反射来调用funcA()一个类ClsA。但是,在类备注Eclipse Juno中显示警告,如下所示。TestAwarning (A)

ClsA是这样的:

public class ClsA {
   String varA;

   ...
   ...

   private String funcA() {
      return varA;
   }
}

这是我使用反射调用的代码funcA()

public class TestA {

   public static void main(String[] args) {
      ClsA clsA = new ClsA();

      Class noparam[] = {};
      Method funcA;
      String retStr;

      funcA = ClsA.class.getDeclaredMethod("funcA", noparam);
      funcA.setAccessible(true);
      retStr = (String) funcA.invoke(clsA, null); // warning (A)
   }
}

这是我得到的警告。基本上我真的不明白警告试图带来什么信息?我怎么能明确地投一个null

应将 null 类型的参数显式转换为 Object[],以便从 Method 类型调用可变参数方法 invoke(Object, Object...)。也可以将其转换为 Object 以进行 varargs 调用

4

2 回答 2

3

方法调用可以有两种,一种是固定参数调用,另一种是可变参数调用。

如果您仅提供 null 作为参数,则 java 不清楚该方法是用于可变参数还是根本没有参数(因为可变参数也可能不接受任何参数)。

因此,即使您不想提供任何参数,它也会要求明确提及 (Object[])null 或 (Object)null。

调用方法

于 2013-05-10T05:22:44.117 回答
2

由于方法签名是(Object obj, Object... vars)除非您声明 null 强制转换,否则最前向的方法是不包含任何参数。

上面代码中的示例:

retStr = (String) funcA.invoke(clsA);

任何时候有 VarArgs (Something...) 都意味着 0 或更多。

于 2013-05-10T05:50:17.770 回答