当前位置: 代码迷 >> Java相关 >> 【求助】关于java.lang.Class类调用的问题?
  详细解决方案

【求助】关于java.lang.Class类调用的问题?

热度:404   发布时间:2007-11-06 22:30:52.0
【求助】关于java.lang.Class类调用的问题?

源代码:
import java.lang.reflect.*;

class ClassTest
{
public static void main(String[] args)
{
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]);
Constructor[] cons=c.getDeclaredConstructors();
Class[] params=cons[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=cons[0].newInstance(paramValues);
Method[] ms=c.getDeclaredMethods();
ms[0].invoke(o,null);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
static
{
System.out.println("loading Point");
}
int x,y;
void output()
{
System.out.println("x="+x+",y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}

错误信息:
F:\javalesson\lesson\ClassTest.java:26: 警告: 最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用;
对于 varargs 调用,应使用 java.lang.Object
对于非 varargs 调用,应使用 java.lang.Object[],这样也可以抑制此警告
ms[0].invoke(o,null);
^
1 警告


不知道是什么意思啊,请大家帮满看下,谢谢

搜索更多相关的解决方案: java  lang  Class  

----------------解决方案--------------------------------------------------------
ms[0].invoke(o,null);
因为JDK1.5以后支持可变参数,你这样写是不明确的

因为编译器不知道你是不想传参数呢,还是想传一个null的参数呢?
所以,如果你不想传参数的时候,可以用ms[0].invoke(o,new Object[0])就可以了,它表示参数的长度是0
也可以这样

Object[] objs=null;
ms[0].invoke(o,objs);

这样就不会有岐义了

----------------解决方案--------------------------------------------------------
非常感谢啊
----------------解决方案--------------------------------------------------------
因为JDK1.5以后支持可变参数,你这样写是不明确的
个人认为 后半句正确,至于前半句有点牵强了

所有的oop 语法里面null表示空,任何对象都可以是null,所以直接使用null会导致编译器无法知道你到底调用的是哪一个重载了
也就是不管是jdk多少版本都有这个限制,甚至是整个oop

[此贴子已经被作者于2007-11-7 11:38:01编辑过]


----------------解决方案--------------------------------------------------------
好像jdk1.4的可以的啊
----------------解决方案--------------------------------------------------------
以下是引用时空之蕊在2007-11-7 11:37:30的发言:
因为JDK1.5以后支持可变参数,你这样写是不明确的
个人认为 后半句正确,至于前半句有点牵强了

所有的oop 语法里面null表示空,任何对象都可以是null,所以直接使用null会导致编译器无法知道你到底调用的是哪一个重载了
也就是不管是jdk多少版本都有这个限制,甚至是整个oop

重载是什么意思,是方法名一样,而参数不一样,参数的不一样可以体现在个数方面也可以体现在类型上面

既然已经是Object类了,所以它可以包容一切参数,但是如果是可变的话,那就不行了,因为null可以表示一个空的数组,也可以表示一个空的对象,其实数组也可以像是一个对象,所以只有在可变参数的时候,编译器才不知道我们想调用哪个方法,是想把null表示一个空的数组呢,还是想把null做为第一个参数传进去呢


----------------解决方案--------------------------------------------------------
  相关解决方案