2011-01-03 15 views
5

Java'daki yansımayı kullanarak başka bir sınıf içinde bir numaralandırma sınıfı bulma konusunda yardıma ihtiyacım var. Bununla çok uzun zamandır mücadele ediyorum. Bunu yanı sıra bir dizi diğer yazıyı okudum ve hepsi aşağıdaki gibi çalışması gerektiğine inanıyorum.Java'da Yansıma kullanarak bir Numaralandırma Sınıfı Bulma

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) 

kimse the- işaret eder misiniz:

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

Ancak, ne gerçekte olur şöyle İkinci ClassNotFoundException olsun, bir modelClass doğru bulunduğunu, ancak attributeEnumerationClass değil - muhtemelen açık - bana hata. Teşekkür ederim.

+1

sınıf 'yüklemeyi deneyin ModelActivity $ AttributeEnumeration'. –

cevap

10

kendiniz görün:

Çıktı:

foo.bar.Outer $ İç

İç sınıf adları bir süre ile, $ ile sınırlandırılmış, bu yüzden ModelActivity$AttributeEnumeration'u istiyorsun. BTW

:

$ sözdizimi sınıf yükleme yalnızca için geçerlidir. aşağıdaki gibi kaynakta sınıfın örneklerine erişim süreleri kullanın:

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

veya böyle:

private foo.bar.Outer.Inner myEnumValue; 

Veya, bu şekilde koymak:

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

Bu delilik, bunu bilmiyordum! –

+0

Sadece bazı iç sınıfları (ör. Olay dinleyicileri) tanımlayın ve çıktı klasörlerinize bakın. Her yerde $$$ göreceksiniz :-) –