正如标题所说,我想知道是否可以通过编程方式了解枚举项用于初始化的构造函数,我认为如果存在这样的机制,则应该可以通过使用反射来访问它,但我有无法找到类似的东西,更具体地说:
我有什么
enum AnEnum {
E1(1),
E1(1, 2);
int v;
AnEnum(int p1) {
v = p1;
}
AnEnum(int p1, int p2) {
v = p1 + p2;
}
}
我需要的是一种机制来告诉我该实例是使用一个参数构造函数还是两个参数构造函数来初始化的,如果我可以获得用于初始化它的参数,那就更好了。
最佳答案
字节码工具,如 asm允许您查看某个枚举值是如何构造的。
尝试 java -classpath "asm.jar;asm-util.jar;yourjar.jar"AnEnum 并查看 clinit 方法:
...
mv.visitMethodInsn(INVOKESPECIAL, "temp/AnEnum", "<init>", "(Ljava/lang/String;II)V", false);
mv.visitFieldInsn(PUTSTATIC, "temp/AnEnum", "E1", "Ltemp/AnEnum;");
...
mv.visitMethodInsn(INVOKESPECIAL, "temp/AnEnum", "<init>", "(Ljava/lang/String;III)V", false);
mv.visitFieldInsn(PUTSTATIC, "temp/AnEnum", "E2", "Ltemp/AnEnum;");
你可以看到E1是用签名(String, int, int)调用的,E2是用签名(String, int, int, int)调用的。前导 (String, int) 可能是字符串名称和 Enum 值的数值,因此您应该只对其余参数感兴趣。
关于java: 是否可以知道一个枚举项用哪个构造函数来初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815064/