Example usage for org.objectweb.asm ClassVisitor ClassVisitor

List of usage examples for org.objectweb.asm ClassVisitor ClassVisitor

Introduction

In this page you can find the example usage for org.objectweb.asm ClassVisitor ClassVisitor.

Prototype

public ClassVisitor(final int api, final ClassVisitor classVisitor) 

Source Link

Document

Constructs a new ClassVisitor .

Usage

From source file:lombok.patcher.scripts.AddFieldScript.java

License:Open Source License

@Override
protected ClassVisitor createClassVisitor(ClassWriter writer, String classSpec,
        TransplantMapper transplantMapper) {
    return new ClassVisitor(Opcodes.ASM4, writer) {
        private boolean alreadyAdded = false;

        @Override/*from ww  w . j  a  va 2 s.  c o  m*/
        public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
            if (name != null && name.equals(fieldName))
                alreadyAdded = true;
            return super.visitField(access, name, desc, signature, value);
        }

        @Override
        public void visitEnd() {
            if (!alreadyAdded) {
                FieldVisitor fv = cv.visitField(accessFlags, fieldName, fieldType, null, value);
                fv.visitEnd();
            }
            super.visitEnd();
        }
    };
}

From source file:net.sf.cglib.core.ClassNameReader.java

License:Apache License

public static String[] getClassInfo(ClassReader r) {
    final List array = new ArrayList();
    try {/*from   w  w w  . j  a  v a2 s.co m*/
        r.accept(new ClassVisitor(Opcodes.ASM5, null) {
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {
                array.add(name.replace('/', '.'));
                if (superName != null) {
                    array.add(superName.replace('/', '.'));
                }
                for (int i = 0; i < interfaces.length; i++) {
                    array.add(interfaces[i].replace('/', '.'));
                }

                throw EARLY_EXIT;
            }
        }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
    } catch (EarlyExitException e) {
    }

    return (String[]) array.toArray(new String[] {});
}

From source file:org.apache.commons.weaver.privilizer.Privilizer.java

License:Apache License

void verify(final String className, final byte[] bytecode) {
    final ClassReader reader = new ClassReader(bytecode);

    env.debug("Verifying bytecode for class %s", className);
    final StringWriter w = new StringWriter(); //NOPMD
    CheckClassAdapter.verify(reader, env.classLoader, false, new PrintWriter(w));
    final String error = w.toString();
    if (!error.isEmpty()) {
        env.error(error);//from ww  w  . ja v a 2 s .  c om
        final StringWriter trace = new StringWriter();
        reader.accept(new TraceClassVisitor(new PrintWriter(trace)), ClassReader.SKIP_DEBUG);
        env.debug(trace.toString());
        throw new IllegalStateException();
    }
    Validate.validState(StringUtils.isBlank(error), error);

    final ClassVisitor checkInnerClasses = new ClassVisitor(ASM_VERSION, null) {
        final Set<String> innerNames = new HashSet<>();

        @Override
        public void visitInnerClass(final String name, final String outerName, final String innerName,
                final int access) {
            super.visitInnerClass(name, outerName, innerName, access);
            Validate.validState(innerNames.add(innerName), "%s already defined", innerName);
        }
    };
    reader.accept(checkInnerClasses, ClassReader.SKIP_CODE);
}

From source file:org.codehaus.groovy.runtime.callsite.GroovySunClassLoader.java

License:Apache License

private void loadAbstract() throws IOException {
    try (final InputStream asStream = GroovySunClassLoader.class.getClassLoader()
            .getResourceAsStream(resName("org.codehaus.groovy.runtime.callsite.AbstractCallSite"))) {
        ClassReader reader = new ClassReader(asStream);
        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        final ClassVisitor cv = new ClassVisitor(CompilerConfiguration.ASM_API_VERSION, cw) {
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {
                super.visit(version, access, name, signature, "sun/reflect/GroovyMagic", interfaces);
            }//from   ww  w. j ava 2s  .  co m
        };
        reader.accept(cv, ClassWriter.COMPUTE_MAXS);
        define(cw.toByteArray(), "org.codehaus.groovy.runtime.callsite.AbstractCallSite");
    }
}

From source file:org.eclipse.andmore.internal.resources.manager.ProjectClassLoader.java

License:Open Source License

/**
 * Rewrites the given class to the given target class file version.
 *//*from w  w w .j a va 2  s.  co  m*/
public static byte[] rewriteClass(byte[] classData, final int maxVersion, final int minVersion) {
    assert maxVersion >= minVersion;
    ClassWriter classWriter = new ClassWriter(0);
    ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM4, classWriter) {
        @Override
        public void visit(int version, int access, String name, String signature, String superName,
                String[] interfaces) {
            if (version > maxVersion) {
                version = maxVersion;
            }
            if (version < minVersion) {
                version = minVersion;
            }
            super.visit(version, access, name, signature, superName, interfaces);
        }
    };
    ClassReader reader = new ClassReader(classData);
    reader.accept(classVisitor, 0);
    return classWriter.toByteArray();
}

From source file:org.fluidity.deployment.maven.ClassReaders.java

License:Apache License

public static ClassWriter makePublic(final String className, final ClassReader reader)
        throws MojoExecutionException {
    assert reader != null : className;
    final ClassWriter writer = new ClassWriter(0);

    final AtomicBoolean constructorFound = new AtomicBoolean(false);

    // make class and its default constructor public
    reader.accept(new ClassVisitor(ASM5, writer) {

        @Override//from  w  w  w  . j a v  a2 s .c om
        public void visit(final int version, final int access, final String name, final String signature,
                final String superName, final String[] interfaces) {
            super.visit(version, access & ~ACC_PRIVATE & ~ACC_PROTECTED | ACC_PUBLIC, name, signature,
                    superName, interfaces);
        }

        @Override
        public MethodVisitor visitMethod(final int access, final String name, final String desc,
                final String signature, final String[] exceptions) {
            final boolean defaultConstructor = name.equals(CONSTRUCTOR_METHOD_NAME)
                    && Type.getArgumentTypes(desc).length == 0;

            if (defaultConstructor) {
                constructorFound.set(true);
            }

            return super.visitMethod(
                    defaultConstructor ? access & ~ACC_PRIVATE & ~ACC_PROTECTED | ACC_PUBLIC : access, name,
                    desc, signature, exceptions);
        }
    }, 0);

    if (!constructorFound.get()) {
        throw new MojoExecutionException(
                String.format("Class %s does not have a default constructor", className));
    }

    return writer;
}

From source file:org.jacoco.core.instr.ResizeInstructionsTest.java

License:Open Source License

/**
 * Test of ASM bug/*from ww  w  .  j av a 2s  .  c o  m*/
 * <a href="https://gitlab.ow2.org/asm/asm/issues/317792">#317792</a>.
 */
@Test
public void should_not_loose_InnerClasses_attribute() throws Exception {
    byte[] source = TargetLoader.getClassDataAsBytes(Inner.class);

    final ClassReader cr = InstrSupport.classReaderFor(source);
    final ClassWriter cw = new ClassWriter(0);
    cr.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, cw) {
        @Override
        public void visitEnd() {
            final MethodVisitor mv = cv.visitMethod(0, "m", "()V", null, null);
            mv.visitCode();
            addCauseOfResizeInstructions(mv);
            mv.visitInsn(Opcodes.NOP);
            mv.visitMaxs(2, 1);
            mv.visitEnd();
            super.visitEnd();
        }
    }, 0);
    source = cw.toByteArray();

    final byte[] bytes = instrumenter.instrument(source, "");

    final TargetLoader targetLoader = new TargetLoader();
    final Class<?> outer = targetLoader.add(ResizeInstructionsTest.class,
            TargetLoader.getClassDataAsBytes(ResizeInstructionsTest.class));
    final Class<?> inner = targetLoader.add(Inner.class, bytes);
    assertSame(outer, inner.getEnclosingClass());
    assertNotNull(inner.getEnclosingClass());
    assertSame(outer, inner.getDeclaringClass());
    assertNotNull(inner.getDeclaringClass());
}

From source file:org.jacoco.core.runtime.ModifiedSystemClassRuntime.java

License:Open Source License

/**
 * Adds the static access method and data field to the given class
 * definition.// w  w w.  j a va  2  s  .  c  o m
 * 
 * @param source
 *            class definition source
 * @param accessFieldName
 *            name of the runtime access field
 * @return instrumented version with added members
 */
public static byte[] instrument(final byte[] source, final String accessFieldName) {
    final ClassReader reader = new ClassReader(source);
    final ClassWriter writer = new ClassWriter(reader, 0);
    reader.accept(new ClassVisitor(Opcodes.ASM4, writer) {

        @Override
        public void visitEnd() {
            createDataField(cv, accessFieldName);
            super.visitEnd();
        }

    }, ClassReader.EXPAND_FRAMES);
    return writer.toByteArray();
}

From source file:org.jacoco.core.test.validation.FramesTest.java

License:Open Source License

private byte[] calculateFrames(byte[] source) {
    ClassReader rc = new ClassReader(source);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

    // Adjust Version to 1.6 to enable frames:
    rc.accept(new ClassVisitor(Opcodes.ASM4, cw) {

        @Override/*from   w  w  w. ja v  a 2s  . c om*/
        public void visit(int version, int access, String name, String signature, String superName,
                String[] interfaces) {
            super.visit(Opcodes.V1_6, access, name, signature, superName, interfaces);
        }
    }, 0);
    return cw.toByteArray();
}

From source file:org.jacoco.core.test.validation.java5.FramesTest.java

License:Open Source License

private byte[] calculateFrames(byte[] source) {
    ClassReader rc = InstrSupport.classReaderFor(source);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

    // Adjust Version to 1.6 to enable frames:
    rc.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, cw) {

        @Override/*from   w  w w. j  a va2s  .  co m*/
        public void visit(int version, int access, String name, String signature, String superName,
                String[] interfaces) {
            super.visit(Opcodes.V1_6, access, name, signature, superName, interfaces);
        }
    }, 0);
    return cw.toByteArray();
}