6

クラス名を入力できるようになり、アプリケーションがそのクラスをロードしてそのインスタンスを作成できるようになるかどうかを確認するために、リフレクションを試しています。数回試行した後、パッケージ名なしでクラス名を貼り付けることができないことがわかったClass.forName()ので、ロードされたすべての利用可能なパッケージのリストを取得しようとし、各パッケージで入力したクラスをロードしようとしましたヒットするまでの名前。

これは私がこれまでに得たものです:

BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
    String s = "";
    do
    {
        ClassLoader clsldr = ClassLoader.getSystemClassLoader();
        Package[] pkgs = Package.getPackages();
        s = console.readLine();
        if(s.equals(":exit"))
        {
            System.exit(0);
        }
        boolean classFound = false;
        Object loadedClass = null;
        String classname = "";
        for (int i = 0; i < pkgs.length; i++) {
            Package package1 = pkgs[i];
            try
            {
                classname = package1.getName().replace('/', '.') + "." + s;
                clsldr.loadClass(classname);
                loadedClass = Class.forName(classname);
                classFound = true;
            }
            catch(Exception e)
            {

            }

        }
        System.out.println("LOADED A CLASS!!!!");
        System.out.println(classname);
        System.out.println(loadedClass);
    }
    while(s.length() == 0);

それは非常に奇妙な方法で動作します。たとえば、プロンプトで「オブジェクト」と入力すると、何とかロードできますsun.net.util.Objectが、実際のオブジェクトを印刷すると、class java.lang.Object. 入力した他のいくつかのものと同様に、同じことが得られStringます。私が試した1つの興味深いものはint、ロードsun.net.util.intされ、オブジェクトを印刷するとnullが返されたことです。私が試したときに別のことが起こりましたJava

Java
LOADED A CLASS!!!!
sun.net.util.Java
null

ここで何が起こっているのか、誰にも手がかりがありますか? sun.net.utilこれを引き起こしているパッケージに特別な何かがありますか? 自分のコードが思い通りに動作しないことはあまり気にしません。この奇妙な動作の原因を知りたいだけです。

Java のバージョン:

java version "1.7.0_25"                                         
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)            
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) 

それが違いを生む場合、私はWindows 8 64ビットを使用しています。

4

3 に答える 3

0

sunおよびで始まるcom.sunクラスは、JVM 内部で使用される、ほとんど文書化されていない内部クラスです。これらは Java API の一部ではなく、異なる JVM には異なるものがあります。これらのさまざまな内部構造がすべて表示されているという事実が、Reflection API の完全修飾名を指定する必要がある理由です。;-)

于 2013-08-08T22:11:50.053 に答える