[英]Finding an Enumeration Class using Reflection in 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卻沒有,也就是說,我得到了第二個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)
有誰能指出 - 可能很明顯 - 錯誤給我。 謝謝。
你自己看:
package foo.bar;
public class Outer{
public enum Inner{}
public static void main(final String[] args){
System.out.println(Inner.class.getName());
}
}
輸出:
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")
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.