2011-01-03 9 views
5

Myślę, że potrzebuję pomocy w znalezieniu klasy wyliczeniowej w ramach innej klasy za pomocą refleksji w Javie. Walczę z tym zbyt długo. Przeczytałem to tak samo, jak wiele innych postów i wszyscy przekonali mnie, że powinien działać tak, jak poniżej.Znajdowanie klasy wyliczeniowej za pomocą Reflection w Javie

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

Jednak to, co naprawdę się dzieje, że modelClass znajduje się poprawnie, ale attributeEnumerationClass nie jest, to znaczy, mam drugą ClassNotFoundException następująco:

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) 

Czy ktoś proszę wskazać dokonywanych poza rynkiem - prawdopodobnie oczywiste - pomyłka dla mnie. Dziękuję Ci.

+1

spróbuj załadować klasę ' ModelActivity $ AttributeEnumeration'. –

Odpowiedz

10

Zobacz sam:

wyjściowa:

foo.bar.Outer $ Wewnętrzna

nazwy wewnętrzne klasy są rozdzielane znakiem $, a nie z okresem, więc chcesz ModelActivity$AttributeEnumeration.

BTW:

$ składnia jest ważna tylko dla klasy obciążenia. Użyj okresy dostęp do instancji klasy w źródle, co następuje:

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

lub tak:

private foo.bar.Outer.Inner myEnumValue; 

Lub, ujmując to w ten sposób:

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

To szalone, nie wiedziałem o tym! –

+0

Po prostu zdefiniuj niektóre klasy wewnętrzne (np. Detektory zdarzeń) i zajrzyj do folderów wyjściowych. Zobaczysz $$$ w każdym miejscu :-) –

Powiązane problemy