首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将编译好的类名与Java中的枚举成员匹配?

如何将编译好的类名与Java中的枚举成员匹配?
EN

Stack Overflow用户
提问于 2010-10-22 16:23:52
回答 5查看 1.2K关注 0票数 4

在Java中,使用Sun的JDK 1.6,具有如下所示的枚举:

代码语言:javascript
运行
复制
public enum MyEnum {
    FIRST_MEMBER { public void foo() { } },
    SECOND_MEMBER { public void foo() { } }, 
    THIRD_MEMBER { public void foo() { } };
}

已编译的文件如下:

代码语言:javascript
运行
复制
MyEnum$1.class  MyEnum$2.class  MyEnum$3.class  MyEnum.class 

这也意味着显示foo()的堆栈跟踪,或者打印在JVisualVM等中的方法调用,在顶部将有类似的内容:

代码语言:javascript
运行
复制
mypackage.MyEnum$1.run()

类名中的$1是由正在编译为匿名内部类的枚举成员造成的。我想知道是否可以安全地假定这些类名中使用的数字映射到定义枚举成员的顺序?如果不是,是否有一种标准的、有保证的方法从用作匿名类名的数字中查找enum成员?

编辑

关于enum的设计,这仅用于说明目的。真正的枚举实现了一个接口,每个成员都提供了方法的不同实现。请不要太在意那些看起来有点奇怪的东西。

编辑#2

为了澄清这一点,我并不打算以编程的方式处理这些信息(比如奇怪的反射废话)。相反,我正在查看堆栈跟踪和分析信息,并试图将对enum成员的方法调用(显示为对匿名类的调用)映射到源代码中的实际enum成员。

EN

Stack Overflow用户

发布于 2010-10-22 16:29:27

您可以与MyEnum.FIRST_MEMBER.getClass().getName()进行比较,这将给出为匿名类生成的名称。

匿名类命名的顺序可能是一致的,但没有得到保证,所以我建议不要依赖它。

您还可以使用非匿名类,在这种情况下,您将知道每个类的名称。

如果您被迫使用匿名类,并且不想在代码中这样做,我相信您只需要尝试手动跟踪。

但是,您可以使用我的上述代码作为调试工具,方法是将其作为辅助方法运行或在调试器中运行。这样,您就可以确认哪个匿名类正在接收每个名称。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3998861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档