Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASM向Java中的枚举添加值_Java_Enums - Fatal编程技术网

使用ASM向Java中的枚举添加值

使用ASM向Java中的枚举添加值,java,enums,Java,Enums,我需要给枚举添加一个值,最简单的方法可能是通过ASM,因为我已经设置好了。 该类如下所示: public enum Example { TEST1, TEST2, TEST3, TEST4 } public enum Example { TEST1, TEST2, TEST3, TEST4, TEST5 } 它需要如下所示: public enum Example { TEST1, TEST2, TEST3, TEST4 } public enum Exa

我需要给枚举添加一个值,最简单的方法可能是通过ASM,因为我已经设置好了。 该类如下所示:

public enum Example
{
    TEST1, TEST2, TEST3, TEST4
}
 public enum Example
 {
     TEST1, TEST2, TEST3, TEST4, TEST5
 }
它需要如下所示:

public enum Example
{
    TEST1, TEST2, TEST3, TEST4
}
 public enum Example
 {
     TEST1, TEST2, TEST3, TEST4, TEST5
 }
当前字节码(使用ASM字节码大纲提取)如下所示

package test;
import java.util.*;
import org.objectweb.asm.*;
public class ExampleDump implements Opcodes {

public static byte[] dump () throws Exception {

ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;

cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER + ACC_ENUM, "appeng/api/config/Example", "Ljava/lang/Enum<Lappeng/api/config/Example;>;", "java/lang/Enum", null);

cw.visitSource("Example.java", null);

{
fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM, "TEST1", "Lappeng/api/config/Example;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM, "TEST2", "Lappeng/api/config/Example;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM, "TEST3", "Lappeng/api/config/Example;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC + ACC_ENUM, "TEST4", "Lappeng/api/config/Example;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_FINAL + ACC_STATIC + ACC_SYNTHETIC, "$VALUES", "[Lappeng/api/config/Example;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "values", "()[Lappeng/api/config/Example;", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(27, l0);
mv.visitFieldInsn(GETSTATIC, "appeng/api/config/Example", "$VALUES", "[Lappeng/api/config/Example;");
mv.visitMethodInsn(INVOKEVIRTUAL, "[Lappeng/api/config/Example;", "clone", "()Ljava/lang/Object;", false);
mv.visitTypeInsn(CHECKCAST, "[Lappeng/api/config/Example;");
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 0);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "valueOf", "(Ljava/lang/String;)Lappeng/api/config/Example;", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(27, l0);
mv.visitLdcInsn(Type.getType("Lappeng/api/config/Example;"));
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", false);
mv.visitTypeInsn(CHECKCAST, "appeng/api/config/Example");
mv.visitInsn(ARETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable("name", "Ljava/lang/String;", null, l0, l1, 0);
mv.visitMaxs(2, 1);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PRIVATE, "<init>", "(Ljava/lang/String;I)V", "()V", null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(27, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Enum", "<init>", "(Ljava/lang/String;I)V", false);
mv.visitInsn(RETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable("this", "Lappeng/api/config/Example;", null, l0, l1, 0);
mv.visitMaxs(3, 3);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(29, l0);
mv.visitTypeInsn(NEW, "appeng/api/config/Example");
mv.visitInsn(DUP);
mv.visitLdcInsn("TEST1");
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKESPECIAL, "appeng/api/config/Example", "<init>", "(Ljava/lang/String;I)V", false);
mv.visitFieldInsn(PUTSTATIC, "appeng/api/config/Example", "TEST1", "Lappeng/api/config/Example;");
mv.visitTypeInsn(NEW, "appeng/api/config/Example");
mv.visitInsn(DUP);
mv.visitLdcInsn("TEST2");
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKESPECIAL, "appeng/api/config/Example", "<init>", "(Ljava/lang/String;I)V", false);
mv.visitFieldInsn(PUTSTATIC, "appeng/api/config/Example", "TEST2", "Lappeng/api/config/Example;");
mv.visitTypeInsn(NEW, "appeng/api/config/Example");
mv.visitInsn(DUP);
mv.visitLdcInsn("TEST3");
mv.visitInsn(ICONST_2);
mv.visitMethodInsn(INVOKESPECIAL, "appeng/api/config/Example", "<init>", "(Ljava/lang/String;I)V", false);
mv.visitFieldInsn(PUTSTATIC, "appeng/api/config/Example", "TEST3", "Lappeng/api/config/Example;");
mv.visitTypeInsn(NEW, "appeng/api/config/Example");
mv.visitInsn(DUP);
mv.visitLdcInsn("TEST4");
mv.visitInsn(ICONST_3);
mv.visitMethodInsn(INVOKESPECIAL, "appeng/api/config/Example", "<init>", "(Ljava/lang/String;I)V", false);
mv.visitFieldInsn(PUTSTATIC, "appeng/api/config/Example", "TEST4", "Lappeng/api/config/Example;");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(27, l1);
mv.visitInsn(ICONST_4);
mv.visitTypeInsn(ANEWARRAY, "appeng/api/config/Example");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitFieldInsn(GETSTATIC, "appeng/api/config/Example", "TEST1", "Lappeng/api/config/Example;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitFieldInsn(GETSTATIC, "appeng/api/config/Example", "TEST2", "Lappeng/api/config/Example;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_2);
mv.visitFieldInsn(GETSTATIC, "appeng/api/config/Example", "TEST3", "Lappeng/api/config/Example;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_3);
mv.visitFieldInsn(GETSTATIC, "appeng/api/config/Example", "TEST4", "Lappeng/api/config/Example;");
mv.visitInsn(AASTORE);
mv.visitFieldInsn(PUTSTATIC, "appeng/api/config/Example", "$VALUES", [Lappeng/api/config/Example;");
mv.visitInsn(RETURN);
mv.visitMaxs(4, 0);
mv.visitEnd();
}
cw.visitEnd();

return cw.toByteArray();
}
}
封装测试;
导入java.util.*;
导入org.objectweb.asm.*;
公共类ExampleDump实现操作码{
公共静态字节[]转储()引发异常{
ClassWriter cw=新的ClassWriter(0);
现场访客fv;
方法回顾性分析;
注释访问者av0;
连续访问(V1_6,ACC_PUBLIC+ACC_FINAL+ACC_SUPER+ACC_ENUM,“appeng/api/config/Example”,“Ljava/lang/ENUM;”,“java/lang/ENUM;”,null);
cw.visitSource(“Example.java”,null);
{
fv=cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC+ACC_ENUM,“TEST1”、“Lappeng/api/config/Example;”,null,null);
fv.visitEnd();
}
{
fv=cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC+ACC_ENUM,“TEST2”,“Lappeng/api/config/Example;”,null,null);
fv.visitEnd();
}
{
fv=cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC+ACC_ENUM,“TEST3”,“Lappeng/api/config/Example;”,null,null);
fv.visitEnd();
}
{
fv=cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC+ACC_ENUM,“TEST4”,“Lappeng/api/config/Example;”,null,null);
fv.visitEnd();
}
{
fv=cw.visitField(ACC_PRIVATE+ACC_FINAL+ACC_STATIC+ACC_SYNTHETIC,“$VALUES”,“[Lappeng/api/config/Example;”,null,null);
fv.visitEnd();
}
{
mv=cw.visitMethod(ACC_PUBLIC+ACC_STATIC,“values”,“()[Lappeng/api/config/Example;”,null,null);
mv.visitCode();
标签l0=新标签();
mv.visitLabel(l0);
mv.visitLineNumber(27,l0);
mv.visitFieldInsn(GETSTATIC,“appeng/api/config/Example”、“$VALUES”、“[Lappeng/api/config/Example;”;
mv.visitMethodInsn(INVOKEVIRTUAL,“[Lappeng/api/config/Example;”,“clone”,“()Ljava/lang/Object;”,false);
mv.visitTypeInsn(CHECKCAST,“[Lappeng/api/config/Example;”);
mv.visitInsn(ARETURN);
mv.visitmax(1,0);
mv.visitEnd();
}
{
mv=cw.visitMethod(ACC_PUBLIC+ACC_STATIC,“valueOf”,“(Ljava/lang/String;)Lappeng/api/config/Example;”,null,null);
mv.visitCode();
标签l0=新标签();
mv.visitLabel(l0);
mv.visitLineNumber(27,l0);
mv.visitLdcInsn(Type.getType(“Lappeng/api/config/Example;”);
mv.visitVarInsn(ALOAD,0);
mv.visitMethodInsn(INVOKESTATIC,“java/lang/Enum”,“valueOf”,“Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;”,false);
mv.visitTypeInsn(CHECKCAST,“apping/api/config/Example”);
mv.visitInsn(ARETURN);
标签l1=新标签();
mv.visitLabel(l1);
mv.visitLocalVariable(“name”,“Ljava/lang/String;”,null,l0,l1,0);
mv.visitmax(2,1);
mv.visitEnd();
}
{
mv=cw.visitMethod(ACC_PRIVATE,“,”(Ljava/lang/String;I)V“,”()V”,null);
mv.visitCode();
标签l0=新标签();
mv.visitLabel(l0);
mv.visitLineNumber(27,l0);
mv.visitVarInsn(ALOAD,0);
mv.visitVarInsn(ALOAD,1);
visitVarInsn mv(ILOAD,2);
mv.visitMethodInsn(特别是调用“java/lang/Enum”,“Ljava/lang/String;I)V”,false);
mv.visitInsn(返回);
标签l1=新标签();
mv.visitLabel(l1);
mv.visitLocalVariable(“this”,“Lappeng/api/config/Example;”,null,l0,l1,0);
mv.visitmax(3,3);
mv.visitEnd();
}
{
mv=连续访问方法(ACC_STATIC,“,”()V”,null,null);
mv.visitCode();
标签l0=新标签();
mv.visitLabel(l0);
mv.visitLineNumber(29,l0);
mv.visitTypeInsn(新增,“apping/api/config/Example”);
mv.visitInsn(DUP);
mv.visitLdcInsn(“测试1”);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKESPECIAL,“appeng/api/config/Example”,“Ljava/lang/String;I)V”,false);
mv.visitFieldInsn(PUTSTATIC,“appeng/api/config/Example”,“TEST1”,“Lappeng/api/config/Example;”);
mv.visitTypeInsn(新增,“apping/api/config/Example”);
mv.visitInsn(DUP);
mv.visitLdcInsn(“测试2”);
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKESPECIAL,“appeng/api/config/Example”,“Ljava/lang/String;I)V”,false);
mv.visitFieldInsn(PUTSTATIC,“appeng/api/config/Example”,“TEST2”,“Lappeng/api/config/Example;”);
mv.visitTypeInsn(新增,“apping/api/config/Example”);
mv.visitInsn(DUP);
mv.visitLdcInsn(“测试3”);
visitInsn mv(ICONST_2);
mv.visitMethodInsn(INVOKESPECIAL,“appeng/api/config/Example”,“Ljava/lang/String;I)V”,false);
mv.visitFieldInsn(PUTSTATIC,“appeng/api/config/Example”,“TEST3”,“Lappeng/api/config/Example;”);
mv.visitTypeInsn(新增,“apping/api/config/Example”);
mv.visitInsn(DUP);
mv.visitLdcInsn(“测试4”);
visitInsn号mv(ICONST_3);
mv.visitMethodInsn(INVOKESPECIAL,“appeng/api/config/Example”,“Ljava/lang/String;I)V”,false);
mv.visitFieldInsn(PUTSTATIC,“appeng/api/config/Example”,“TEST4”,“Lappeng/api/config/Example;”);
标签l1=新标签();
mv.visitLabel(l1);
mv.visitLineNumber(27,l1);
visitInsn号mv(ICONST_4);
mv.visitTypeInsn(ANEWARRAY,“apping/api/config/Example”);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitFieldInsn(GETSTATIC,“appeng/api/config/Example”,“TEST1”,“Lappeng/api/config/Example;”);
visitInsn号(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitFieldInsn(GETSTATIC,“appeng/api/config/Example”,“TEST2”,“Lappeng/api/config/Example;”);
visitInsn号(AASTORE);
mv.visitInsn(DUP);
visitInsn mv(ICONST_2);
mv.visitFieldInsn(GETSTATIC,“appeng/api/config/Example”,“TEST3”,“Lappeng/api/config/Example;”);
visitInsn号(AASTORE);
mv.visitInsn(DUP);
visitInsn号mv(ICONST_3);
mv.visitFieldInsn(GETSTATIC,“appeng/api/config/Example”,“TEST4”,“Lappeng/api/config/Example;”);
visitInsn号(AASTORE);
mv.visitFieldInsn(PUTSTATIC,“appeng/api/config/Example”、“$VALUES”、[Lappeng/api/config/Example;”;
mv.visitInsn(返回);
mv.visitmax(4,0);
mv.visitEnd();
}
cw.visitEnd();
返回cw.toByteArray();
}
}

希望有人能帮助我,知道我需要做什么。

相同的符号(
TEST3
)在枚举中多次出现意味着什么?“我需要向枚举添加一个值,可能最简单的方法是通过ASM,因为我已经设置好了。。。“你还没有…设置JDK吗?当然,最简单的方法是编辑源代码并编译它。谢谢你,我复制了错误的版本。”