Java:静态嵌套类和反射: "$"与 "."

标签 java reflection nested-class

如果我在下面的代码中有一个 com.example.test.Enum2.Test 类,为什么 getCanonicalName() 返回 com.example。 test.Enum2.TestClass.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/

相关文章:

java - 静态嵌套类实例

java - 从 BlackBerry 上的自定义上下文菜单中删除默认项目

java - 如何缩放图像

c# - 成员在另一个模块中声明,需要导入

javascript - 为 window.location 附加更改通知程序

java - 如何在 jOOQ 中为 VisitListener 中的每一行正确地将值添加到 StoreQuery 中?

java - 使用 java swing.image 更改透明度的方法

JDBC 结果集/语句中的 Java 内存泄漏

c++ - 使用模板的嵌套类中的未知类型名称 'class'