2011-01-03 15 views
5

Javaでのリフレクションを使用して、別のクラス内の列挙型クラスを見つけるための助けが必要だと思います。私はこれほど長い間、これと戦ってきました。私はこれだけでなく、いくつかの他の投稿を読んでおり、彼らはすべて私が以下のように動作すべきだと私に信じさせる。次のようにJavaでのリフレクションを使用した列挙型クラスの検索

public class ModelActivity { 
    public enum AttributeEnumeration { MODELID, MODELURGENCY, MODELDUEDATEANDTIME } 

    public static void main(String[] args) { 
    // Find the class with the given name 
    String className = "ModelActivity"; 
    Class modelClass = null; 
    try { 
     // Retrieve the Class with the given className... 
     modelClass = Class.forName(className); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException("Class by name '" + className + "' not found.", e); 
    } 

    // Find the AttributeEnumeration within the class 
    String attributeEnumerationClassName = className + ".AttributeEnumeration"; 
    Class attributeEnumerationClass = null; 
    try { 
     attributeEnumerationClass = Class.forName(attributeEnumerationClassName); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException("Class by name '" + attributeEnumerationClassName + "' not found.", e); 
    } 
    } 
} 

は、しかし、実際に何が起こることはmodelClassが正しく検出されたということですが、attributeEnumerationClassではない、つまり、私は2番目のClassNotFoundExceptionが取得:

Exception in thread "main" java.lang.RuntimeException: Class by name 'ModelActivity.AttributeEnumeration' not found. 
at ModelActivity.main(ModelActivity.java:27) 
    Caused by: java.lang.ClassNotFoundException: ModelActivity.AttributeEnumeration 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:169) 
at ModelActivity.main(ModelActivity.java:25) 

誰がザ・ポイントしてもらえおそらく明らかです - 私に間違っている。ありがとうございました。

+1

は 'クラスをロードしてくださいModelActivity $ AttributeEnumeration'を呼び出します。 –

答えて

10

は自分のために参照してください:

出力:

foo.bar.Outer $インナー

内部クラス名がない期間に、$で区切られているので、あなたはModelActivity$AttributeEnumerationが欲しいです。

BTW:

$構文は、クラスの読み込みにのみ有効です。次のようにソースにクラスのインスタンスにアクセスするにはピリオドを使用します。

import foo.bar.Outer.Inner; 
// ... 
private Inner myEnumValue; 

またはこのような:

private foo.bar.Outer.Inner myEnumValue; 

それとも、このようにそれを置くために:

assertEquals(// two ways to reference the same class 
    foo.bar.Outer.Inner.class, 
    Class.forName("foo.bar.Outer$Inner") 
); 
+0

それは狂っている、私はそれを知らなかった! –

+0

いくつかの内部クラス(イベントリスナーなど)を定義し、出力フォルダを調べます。どこにでも$$$が表示されます:-) –

関連する問題