gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:07 25 4
gpt4 key购买 nike

如果我在下面的代码中有一个 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/

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