日期:2014-05-20  浏览次数:20719 次

发现最近问题很多,这次是关于反射API的 。
本帖最后由 a1143934776 于 2013-03-23 20:34:45 编辑


import java.lang.reflect.*;

class Hu
{
public static void main(String [] args)
{
if(args.length!=1){
return;
}
try{
Class c=Class.forName(args[0]);
Constructor[] cons=c.getDeclaredConstructors();
Class [] cs=cons[0].getParameterTypes();


Object []csvalues=new Object[cs.length];//这里不懂


for(int i=0;i<cs.length;i++)
{
if(cs[i].isPrimitive())
{
csvalues[i]=new Integer(i+4);
}

}
Object o=cons[0].newInstance(csvalues);
                      //因为这里 ^  传入的是参数的值,
//所以要用构造对象来调用该方法来创建一个新的对象并赋值给构造方法里的形参;


Method[] m=c.getDeclaredMethods();


m[0].invoke(o,null);

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


}
}

class Point{

// static{
// System.out.println("我要晕了");
// }
int x,y;
void output()
{
System.out.println("x="+x+","+"y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
我想知道,我哪里写错了?为什么会出现错误,还有反射API需要重点掌握吗?传参这里听不懂我晕,其他的如获取未知类里的方法还能理解,但传参这里就不懂了。 Object []csvalues=new Object[cs.length];//这里不懂


for(int i=0;i<cs.length;i++)
{
if(cs[i].isPrimitive())
{
csvalues[i]=new Integer(i+4);
}

}
Object o=cons[0].newInstance(csvalues);
                      //因为这里 ^  传入的是参数的值,
//所以要用构造对象来调用该方法来创建一个新的对象并赋值给构造方法里的形参;


Method[] m=c.getDeclaredMethods();


m[0].invoke(o,null);


这里。请高手的详细解释,谢谢。
api object

------解决方案--------------------
这是编译期的警告,可以不管它,程序可以正常运行,要想没有警告就

m[0].invoke(o);
            //invoke 方法第二个参数起表示是原方法要传入的参数

但千万不要用1L的,因为原方法没有参数,传个null进去就表示有参数的了,当然就会报错了

Class[] cs = cons[0].getParameterTypes();
//得到第一个构造器的参数类型
Object[] csvalues = new Object[cs.length];// 这里不懂
//根据构造器的参数个数构造一个数组