如果我在下面的代码中有一个 com.example.test.Enum2.Test
类,为什么 getCanonicalName()
返回 com.example。 test.Enum2.Test
但 Class.forName()
需要 "com.example.test.Enum2$Test"
作为参数?
有没有一种方法可以保持一致,这样我就可以通过名称序列化/反序列化枚举值,而不必检查每个 $
与 .
的可能性,当枚举是一个嵌套类?
package com.example.test;
import java.util.Arrays;
public class Enum2 {
enum Test {
FOO, BAR, BAZ;
}
public static void main(String[] args) {
for (String className : Arrays.asList(
"com.example.test.Enum2.Test",
"com.example.test.Enum2$Test"))
{
try {
Class<?> cl = Class.forName(className);
System.out.println(className+" found: "+cl.getCanonicalName());
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
System.out.println(Test.FOO.getDeclaringClass().getCanonicalName());
}
}
说明:我正在寻找一种在实际应用程序(不仅仅是上面设计的测试用例)中处理此问题的好方法,要么:
一个。使用 getCanonicalName()
的输出(仅限点名)进行序列化/反序列化,对于 Class.forName()
依次尝试每种可能性,例如首先是 "com.example.test.Enum2.Test"
,然后是 "com.example.test.Enum2$Test"
,然后是 "com.example.test $Enum2$Test"
等
使用正确的 $ 表示法,以便 Class.forName()
第一次就可以正常工作。但这需要我实现 getCanonicalName() 的替代方法,它生成与 Class.forName()
一致的字符串。
我倾向于方法 (b),部分是出于直觉,部分是因为方法 (a) 如果包名带有大写字母,则方法 (a) 会产生歧义:com.example.Test.Enum2 和 com.example.Test$Enum2如果有 com/example/Test/Enum2.java 和包含 Enum2 内部类的 com/example/Test.java,都可以是 Class.forName()
的有效输入。
...但我不知道如何实现它。有什么想法吗?
最佳答案
ARGH:我应该简单地使用 Class.getName()
而不是 Class.getCanonicalName()
。
关于Java:静态嵌套类和反射: "$"与 ".",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948847/