import java.util.*;
import java.text.*;
import java.lang.reflect.*;
public class Test {
String name;
public Test()
{
System.out.println("In Construtor");
}
public Test(String name)
{
this.name=name;
System.out.println("In Construtor paramitarized-----"+name);
}
public int q() {
System.out.println("working");
return 1;
}
public static void main(String args[] ) throws Exception {
Class c=Class.forName("Test");
Test t=(Test)c.newInstance();
t.q();
Constructor cons[]=c.getConstructors();
for(Constructor ci:cons)
ci.newInstance();
Constructor<?> pcon=c.getConstructor(String.class);
pcon.newInstance();
System.out.println(Test.class.getName());
}
}
我只是在尝试掌握Class和ClassLoader类的概念。
现在为这一行Constructor<?> pcon=c.getConstructor(String.class);
显示IllegalArgumentException:为什么?
谢谢你Jon Skeet :)我改变了我的代码及其工作
Class c=Class.forName("Test");
Test t=(Test)c.newInstance();
t.q();
Constructor<?> pcon=c.getConstructor(String.class);
pcon.newInstance("arijit");
System.out.println(Test.class.getName());
但是当我使用-Xlint编译时,它给出了下面提到的警告: 取消选中调用getConstructor(java.lang.Class ....)作为原始类型java.lang.Class的成员
这是什么意思?
答案 0 :(得分:8)
你误诊了它。这不是抛出异常的声明 - 这是:
ci.newInstance();
你试图为两个构造函数调用它(由于for
循环) - 所以当它调用无参数构造函数时它会没问题,但是当它调用时它不会具有String
参数的那个。您必须更改该调用以传递正确数量的参数,具体取决于当时构造函数ci
所指的。
您稍后遇到同样的问题:
pcon.newInstance();
这次你知道有一个String
参数(你刚刚要求一个带字符串参数的构造函数)所以你绝对知道你应该提供String
参数,例如
pcon.newInstance("foo");
此外,您应该尝试找出您认为失败的getConstructor()
电话的原因。例外应该给你一个堆栈跟踪,其上有正确的行...重要的是能够准确地诊断问题,所以这次看错了。