java: 是否可以知道一个枚举项用哪个构造函数来初始化?

标签 java reflection constructor enums initialization

正如标题所说,我想知道是否可以通过编程方式了解枚举项用于初始化的构造函数,我认为如果存在这样的机制,则应该可以通过使用反射来访问它,但我有无法找到类似的东西,更具体地说:

我有什么

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/

相关文章:

ActiveMQ版本与jre 1.5冲突

java - 停止java中继承树中某些类类型的序列化

java - 方法 'java.lang.reflect.Method.getDefaultValue()' 的效用?

c# - C#反射实用程序

java - 在 java.io.File 中找不到构造函数 File()

java - null 检查语句是否在 java 中不起作用

java - getContentLength 在尝试获取 XML 文件时返回 -1

Java反射-从哪里继承的方法?

struct - 我可以为带有可变数量参数的 Scheme (Racket) 结构编写构造函数吗?

c# - 如何让重载的构造函数同时调用默认构造函数和基构造函数的重载?