Java getConstructor()方法 import java.util.*; 导入java.text.*; 导入java.lang.reflect.*; 公开课考试{ 字符串名; 公开考试() { System.out.println(“In Construtor”); } 公共测试(字符串名称) { this.name=name; System.out.println(“In-Construtor paramitarized-----”+名称); } 公共int q(){ 系统输出打印(“工作”); 返回1; } 公共静态void main(字符串args[])引发异常{ 类别c=类别forName(“测试”); Test t=(Test)c.newInstance(); t、 q(); 构造函数cons[]=c.getConstructors(); 对于(构造函数ci:cons) ci.newInstance(); 构造函数pcon=c.getConstructor(String.class); pcon.newInstance(); System.out.println(Test.class.getName()); } }

Java getConstructor()方法 import java.util.*; 导入java.text.*; 导入java.lang.reflect.*; 公开课考试{ 字符串名; 公开考试() { System.out.println(“In Construtor”); } 公共测试(字符串名称) { this.name=name; System.out.println(“In-Construtor paramitarized-----”+名称); } 公共int q(){ 系统输出打印(“工作”); 返回1; } 公共静态void main(字符串args[])引发异常{ 类别c=类别forName(“测试”); Test t=(Test)c.newInstance(); t、 q(); 构造函数cons[]=c.getConstructors(); 对于(构造函数ci:cons) ci.newInstance(); 构造函数pcon=c.getConstructor(String.class); pcon.newInstance(); System.out.println(Test.class.getName()); } },java,Java,我只是试图掌握类和类加载器类的概念。 现在对于这一行Constructor pcon=c.getConstructor(String.class)它显示IllegalArgumentException:为什么 谢谢Jon Skeet:)我用这个和它的工作原理更改了我的代码 import java.util.*; import java.text.*; import java.lang.reflect.*; public class Test { String name; public Test

我只是试图掌握类和类加载器类的概念。 现在对于这一行
Constructor pcon=c.getConstructor(String.class)它显示IllegalArgumentException:为什么

谢谢Jon Skeet:)我用这个和它的工作原理更改了我的代码

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 c=Class.forName(“测试”);
Test t=(Test)c.newInstance();
t、 q();
构造函数pcon=c.getConstructor(String.class);
pcon.newInstance(“arijit”);
System.out.println(Test.class.getName());
但当我使用-Xlint编译时,它给出了以下警告: 取消选中call getConstructor(java.lang.Class…)作为原始类型java.lang.Class的成员


这是什么意思?

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

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());
您试图为这两个构造函数调用它(由于
for
循环),因此当它调用无参数构造函数时,它就可以了,但当它调用带有
字符串的构造函数时就不行了。根据当时引用的构造函数
ci
,您必须更改该调用以传入正确数量的参数

稍后您会遇到相同的问题:

ci.newInstance();
这一次,您知道有一个
String
参数(您刚刚请求了一个带有String参数的构造函数),因此您完全知道应该提供一个
String
参数,例如

pcon.newInstance();

此外,您应该尝试找出您认为失败的是
getConstructor()
调用的原因。异常应该给您一个堆栈跟踪,上面有正确的行。。。能够准确地诊断问题很重要,因此值得一看这次出了什么问题。

问题是他对每个构造函数都调用了
ci.newinstance()
。@TedHopp:确实如此。正确的陈述,正确的理由——只是错过了一个事实,那就是它在失败之前可能已经工作过一次:)非常感谢。我像这样修改了我的代码,现在可以工作了。类别c=类别forName(“测试”);Test t=(Test)c.newInstance();t.q();构造函数pcon=c.getConstructor(String.class);pcon.newInstance(“arijit”);System.out.println(Test.class.getName())@Jon Skeet但是当我使用-Xlint编译时,它给出了下面提到的警告:取消选中call getConstructor(java.lang.Class…)作为原始类型java.lang.Class的成员这意味着什么?您的
c
变量只是
Class
类型,这是一种原始类型。使用
Class
,我怀疑错误会消失。
pcon.newInstance("foo");