private void END(final int maxStack, final int maxLocals) {
   this.current.visitMaxs(maxStack, maxLocals);
   this.current.visitEnd();
   ClassWriter cw = new ClassWriter(0);
   cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "C", null, "java/lang/Object", null);
   MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
   mv.visitCode();
   mv.visitVarInsn(Opcodes.ALOAD, 0);
   mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
   mv.visitInsn(Opcodes.RETURN);
   mv.visitMaxs(1, 1);
   mv.visitEnd();
   ((MethodNode) this.current).accept(cw);
   cw.visitEnd();
   byte[] b = cw.toByteArray();
   try {
     TestClassLoader loader = new TestClassLoader();
     Class<?> c = loader.defineClass("C", b);
     c.newInstance();
   } catch (Throwable t) {
     fail(t.getMessage());
   }
   this.current = null;
 }
Пример #2
0
  public void test() throws Exception {
    ClassWriter cw = new ClassWriter(true);
    ClassVisitor cv = new StaticInitMerger("$clinit$", cw);
    cv.visit(V1_1, ACC_PUBLIC, "A", null, "java/lang/Object", null);
    cv.visitField(ACC_PUBLIC + ACC_STATIC, "counter", "I", null, null);
    for (int i = 0; i < 5; ++i) {
      MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<clinit>", "()V", null, null);
      mv.visitFieldInsn(GETSTATIC, "A", "counter", "I");
      mv.visitInsn(ICONST_1);
      mv.visitInsn(IADD);
      mv.visitFieldInsn(PUTSTATIC, "A", "counter", "I");
      mv.visitInsn(RETURN);
      mv.visitMaxs(0, 0);
    }
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    cv.visitEnd();

    Class c = LOADER.defineClass("A", cw.toByteArray());
    assertEquals(c.getField("counter").getInt(c.newInstance()), 5);
  }