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());
    }
}

I was just trying grasp the concepts of Class and ClassLoader Classes. Now for this line Constructor<?> pcon=c.getConstructor(String.class); its showing that IllegalArgumentException: why?

Thank you Jon Skeet :) I changed my code with this and its working

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());

But When I am compiling with -Xlint ,its giving below mentioned warning: Uncheck call getConstructor(java.lang.Class....) as a member of raw type java.lang.Class

What does this mean?

4

1 に答える 1

8

あなたはそれを誤診しました。これは、例外をスローしているステートメントではありません-これは次のとおりです。

ci.newInstance();

両方のコンストラクターに対してこれを呼び出そうとしています(forループのため)。したがって、パラメーターのないコンストラクターを呼び出す場合は問題ありませんが、パラメーターを使用するコンストラクターを呼び出す場合は問題ありませんString。その呼び出しを変更して、その時点でどのコンストラクターが参照しているかに応じて、適切な数の引数を渡す必要がありますci

後で同じ問題が発生します。

pcon.newInstance();

今回はパラメーターがあることを知っStringいるので(文字列パラメーターを持つコンストラクターを要求したばかりです) 、引数を指定する必要があることを絶対に知っています。String

pcon.newInstance("foo");

getConstructor()さらに、失敗したのはなぜコールだと思ったのかを解明する必要があります。例外は、正しい行を含むスタックトレースを提供するはずです...問題を正確に診断できることが重要なので、今回は何がうまくいかなかったかを調べる価値があります。

于 2013-01-04T19:58:37.110 に答える