2
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 Classes 的概念。现在这一行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 进行编译时,它给出了下面提到的警告: Uncheck call getConstructor(java.lang.Class....) as a member of raw type java.lang.Class

这是什么意思?

4

1 回答 1

8

你误诊了。这不是引发异常的语句 - 这是:

ci.newInstance();

您正在尝试为两个构造函数调用它(由于for循环) - 所以当它调用无参数构造函数时会很好,但当它调用带参数的构造函数时不会String。您必须根据当时ci引用的构造函数更改该调用以传递正确数量的参数。

你以后有同样的问题:

pcon.newInstance();

这次你知道有一个String参数(你刚刚要求一个带有字符串参数的构造函数)所以你绝对知道你应该提供一个String参数,例如

pcon.newInstance("foo");

此外,您应该尝试找出您认为是getConstructor()呼叫失败的原因。异常应该给你一个堆栈跟踪,上面有正确的行……能够准确地诊断问题很重要,所以这次有必要看看哪里出了问题。

于 2013-01-04T19:58:37.110 回答