在Java中,使用Sun的JDK 1.6,具有如下所示的枚举:
public enum MyEnum {
FIRST_MEMBER { public void foo() { } },
SECOND_MEMBER { public void foo() { } },
THIRD_MEMBER { public void foo() { } };
}已编译的文件如下:
MyEnum$1.class MyEnum$2.class MyEnum$3.class MyEnum.class 这也意味着显示foo()的堆栈跟踪,或者打印在JVisualVM等中的方法调用,在顶部将有类似的内容:
mypackage.MyEnum$1.run()类名中的$1是由正在编译为匿名内部类的枚举成员造成的。我想知道是否可以安全地假定这些类名中使用的数字映射到定义枚举成员的顺序?如果不是,是否有一种标准的、有保证的方法从用作匿名类名的数字中查找enum成员?
编辑
关于enum的设计,这仅用于说明目的。真正的枚举实现了一个接口,每个成员都提供了方法的不同实现。请不要太在意那些看起来有点奇怪的东西。
编辑#2
为了澄清这一点,我并不打算以编程的方式处理这些信息(比如奇怪的反射废话)。相反,我正在查看堆栈跟踪和分析信息,并试图将对enum成员的方法调用(显示为对匿名类的调用)映射到源代码中的实际enum成员。
发布于 2010-10-22 16:29:27
您可以与MyEnum.FIRST_MEMBER.getClass().getName()进行比较,这将给出为匿名类生成的名称。
匿名类命名的顺序可能是一致的,但没有得到保证,所以我建议不要依赖它。
您还可以使用非匿名类,在这种情况下,您将知道每个类的名称。
如果您被迫使用匿名类,并且不想在代码中这样做,我相信您只需要尝试手动跟踪。
但是,您可以使用我的上述代码作为调试工具,方法是将其作为辅助方法运行或在调试器中运行。这样,您就可以确认哪个匿名类正在接收每个名称。
https://stackoverflow.com/questions/3998861
复制相似问题