gpt4 book ai didi

java - 在 Java 中使用反射查找枚举类

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:06 26 4
gpt4 key购买 nike

我想我需要一些帮助,以便在 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$Inner

内部类名称由 $ 分隔,而不是句点,因此您需要 ModelActivity$AttributeEnumeration

顺便说一句:

$ 语法仅对类加载有效。使用句点访问源中类的实例,如下所示:

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

关于java - 在 Java 中使用反射查找枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4582992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com