2011-01-03 30 views
5

Tôi nghĩ rằng tôi cần một số trợ giúp trong việc tìm kiếm một lớp liệt kê trong lớp khác bằng cách sử dụng sự phản chiếu trong Java. Tôi đã chiến đấu với điều này quá lâu rồi. Tôi đã đọc điều này cũng như một số bài viết khác và tất cả đều khiến tôi tin rằng nó sẽ hoạt động như sau.Tìm một lớp liệt kê bằng cách sử dụng Reflection trong 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); 
    } 
    } 
} 

Tuy nhiên, những gì thực sự xảy ra là modelClass được tìm thấy một cách chính xác, nhưng attributeEnumerationClass không phải là, đó là, tôi nhận được ClassNotFoundException thứ hai như sau:

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) 

thể bất cứ ai xin vui lòng chỉ gì- - rõ ràng là - sai lầm với tôi. Cảm ơn bạn.

+1

Thử tải lớp ' ModelActivity $ AttributeEnumeration'. –

Trả lời

10

Xem cho chính mình:

Output:

foo.bar.Outer $ Nội

tên lớp Nội được giới hạn với $, không phải với một thời gian, vì vậy bạn muốn ModelActivity$AttributeEnumeration.

BTW:

Cú pháp $ chỉ hợp lệ để tải lớp học. Sử dụng thời gian để truy cập vào các thể hiện của lớp trong nguồn như sau:

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

hay như thế này:

private foo.bar.Outer.Inner myEnumValue; 

Hoặc, để đặt nó theo cách này:

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

Thật điên rồ, tôi không biết điều đó! –

+0

Chỉ cần xác định một số lớp bên trong (ví dụ: trình lắng nghe sự kiện) và tìm trong các thư mục đầu ra của bạn. Bạn sẽ thấy $$$ trên tất cả các nơi :-) –

Các vấn đề liên quan