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

我有的

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;");


您可以看到以签名(String,int,int)调用E1,以签名(String,int,int,int)调用E2。前导(String,int)可能是字符串名称和Enum值的数字值,因此您应该只对其余参数感兴趣。

10-05 18:09