Reflect API警告问题

警告地方(ms[0].invoke(o,null);)
最后报了一个警告:
要从类型 Method 中调用 varargs 方法 invoke(Object, Object...),应该将类型为 null 的参数显式地强制转换为 Object[]。对于 varargs 调用来说,也可以将其强制转换为 Object
不是很明白问题警告中应该将类型为 null 的参数显式地强制转换为 Object[]。对于 varargs 调用来说,也可以将其强制转换为 Object。应该怎样改。

 

import java.lang.reflect.*;
public class ClassTest
{
public static void main(String[] args)

try
{
Class c=Class.forName(args[0]);
Constructor[] conc=c.getDeclaredConstructors();
Class[] params=conc[0].getParameterTypes();
Object[] paramValues=new Object[params.length];
for(int i=0;i<params.length;i++)
{
if(params[i].isPrimitive())
paramValues[i]=new Integer(i+3);
}
Object o=conc[0].newInstance(paramValues);
Method[] ms=c.getDeclaredMethods();
try{
ms[0].invoke(o,null);
}
catch(IllegalAccessException e){
e.printStackTrace();
}
catch(IllegalArgumentException e){
e.printStackTrace();

}
catch(InvocationTargetException e){
e.printStackTrace();
}
catch(NullPointerException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}



}
catch(Exception ex)
{

}


}


}
class Point
{
static
{
System.out.println("Ponit is loading");
}
int x,y;
void outPut()
{
System.out.println("X="+x+"Y="+y);
              }
Point(int x,int y){
this.x=x;
this.y=y;
}

}
class Line
{
static
{
System.out.println("Line is loading");
}
}

楼主的问题跟反射没关系,只是跟可变长度参数有关系而已。
简单来说,Java的可变长度参数(varargs)就是一种语法糖,可以让你把写可变个数的参数,由编译器帮忙打包成数组,也可以直接传数组进去:
[code="java"]public class VarargsDemo {
static void foo(String s, Object... args) { // varargs here
System.out.println(s);
for (Object o : args) {
System.out.println(o);
}
}

public static void main(String[] args) {
    Object[] array = { "a", "b", "c" };
    foo("test1", array);         // pass in array
    foo("test2", "d", "e", "f"); // let compiler generate the array
}

}[/code]
如果在上面的代码里写成这样:foo(null, null);的话,编译器就无法分辨这个null到底是指new Object[] { null }(作为Object类型)还是就是null(作为Object[])。
所以如果遇到varargs时,要传入一个Object类型的参数,值为null的话,就在null前面加一个(Object)的转换就行:
[code="java"]foo("testNull", (Object)null);[/code]
这样编译器就知道这是要让它来打包数组。这样args就是{ null },一个长度为1的一维数组。
如果写成:
[code="java"]foo("testNullArray", (Object[])null);[/code]
那就是告诉编译器不要打包数组,直接传个null作为args的值。

把上面的例子修改一下:
[code="java"]public class Demo {
static void foo(String s, Object... args) {
System.out.println(s);
for (Object o : args) {
System.out.println(o);
}
}

public static void main(String[] args) {
    Object[] array = { "a", "b", "c" };
    foo("test1", array);
    foo("test2", "d", "e", "f");
    foo("testNull", (Object)null);
    foo("testNullArray", (Object[])null);
}

}[/code]
运行,输出是:
[code=""]test1
a
b
c
test2
d
e
f
testNull
null
testNullArray
Exception in thread "main" java.lang.NullPointerException
at y.foo(y.java:4)
at y.main(y.java:14)[/code]
可以看到null的两种用法的区别。