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:org.jacoco.core.test.validation.ResizeInstructionsTest.java

License:Open Source License

/**
 * Test of ASM bug/*w w  w  . j  a va 2s .c om*/
 * <a href="https://gitlab.ow2.org/asm/asm/issues/317792">#317792</a>.
 */
@Test
public void should_not_loose_InnerClasses_attribute() throws Exception {
    // FIXME fails without COMPUTE_FRAMES because of
    // https://gitlab.ow2.org/asm/asm/issues/317800
    final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    final ClassReader cr = new ClassReader(TargetLoader.getClassDataAsBytes(Inner.class));
    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);
    final byte[] bytes = instrumenter.instrument(cw.toByteArray(), "");

    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.javaweb.utils.ASMClassUtils.java

License:Apache License

/**
 * ASM??,??????class//  w  w w.j a  v a2s.c  om
 *
 * @param classFileBuffer ?
 * @return
 */
public Map<String, List<AnnotationNode>> getClassAnnotation(byte[] classFileBuffer) {
    final Map<String, List<AnnotationNode>> annotationNodeMap = new LinkedHashMap<String, List<AnnotationNode>>();
    final List<AnnotationNode> classAnnotationNodeList = new ArrayList<AnnotationNode>();
    final List<AnnotationNode> methodAnnotationNodeList = new ArrayList<AnnotationNode>();
    final List<AnnotationNode> fieldAnnotationNodeList = new ArrayList<AnnotationNode>();
    final ClassReader cr = new ClassReader(classFileBuffer);

    if (!ClassUtils.isInterface(cr)) {

        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);

        cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {
            @Override
            public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                AnnotationNode an = new AnnotationNode(desc);
                classAnnotationNodeList.add(an);

                return an;
            }

            @Override
            public MethodVisitor visitMethod(int access, String methodName, String argTypeDesc,
                    String signature, String[] exceptions) {
                final MethodVisitor mv = super.visitMethod(access, methodName, argTypeDesc, signature,
                        exceptions);
                return new MethodVisitor(Opcodes.ASM5, mv) {

                    @Override
                    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                        AnnotationNode an = new AnnotationNode(desc);
                        methodAnnotationNodeList.add(an);

                        return an;
                    }
                };
            }

            @Override
            public FieldVisitor visitField(int access, String methodName, String argTypeDesc, String signature,
                    final Object value) {
                final FieldVisitor fv = super.visitField(access, methodName, argTypeDesc, signature, value);
                return new FieldVisitor(Opcodes.ASM5, fv) {
                    @Override
                    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                        AnnotationNode an = new AnnotationNode(desc);
                        fieldAnnotationNodeList.add(an);

                        return an;
                    }
                };
            }
        }, ClassReader.EXPAND_FRAMES);
    }

    annotationNodeMap.put("class", classAnnotationNodeList);
    annotationNodeMap.put("method", methodAnnotationNodeList);
    annotationNodeMap.put("field", fieldAnnotationNodeList);

    return annotationNodeMap;
}

From source file:org.jboss.as.hibernate.Hibernate51CompatibilityTransformer.java

License:Open Source License

@Override
public byte[] transform(final ClassLoader loader, final String className, final Class<?> classBeingRedefined,
        final ProtectionDomain protectionDomain, final byte[] classfileBuffer) {
    logger.debugf("Hibernate51CompatibilityTransformer transforming deployment class '%s' from '%s'", className,
            getModuleName(loader));/*from   w  ww  .  j  a va 2 s  .  co  m*/

    final Set<String> parentClassesAndInterfaces = new HashSet<>();
    collectClassesAndInterfaces(parentClassesAndInterfaces, loader, className);
    logger.tracef("Class %s extends or implements %s", className, parentClassesAndInterfaces);

    final TransformedState transformedState = new TransformedState();
    final ClassReader classReader = new ClassReader(classfileBuffer);
    final ClassWriter classWriter = new ClassWriter(classReader, 0);
    ClassVisitor traceClassVisitor = classWriter;
    PrintWriter tracePrintWriter = null;
    try {
        if (showTransformedClassFolder != null) {
            tracePrintWriter = new PrintWriter(
                    new File(showTransformedClassFolder, className.replace('/', '_') + ".asm"));
            traceClassVisitor = new TraceClassVisitor(classWriter, tracePrintWriter);
        }
    } catch (IOException ignored) {

    }
    try {
        classReader.accept(new ClassVisitor(useASMExperimental ? Opcodes.ASM7_EXPERIMENTAL : Opcodes.ASM6,
                traceClassVisitor) {

            // clear transformed state at start of each class visit
            @Override
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {
                // clear per class state
                transformedState.clear();
                super.visit(version, access, name, signature, superName, interfaces);
            }

            // check if class has already been transformed
            @Override
            public FieldVisitor visitField(int access, String name, String desc, String signature,
                    Object value) {
                // check if class has already been modified
                if (markerAlreadyTransformed.equals(name) && desc.equals("Z")) {
                    transformedState.setAlreadyTransformed(true);
                }
                return super.visitField(access, name, desc, signature, value);
            }

            // mark class as transformed (only if class transformations were made)
            @Override
            public void visitEnd() {
                if (transformedState.transformationsMade()) {
                    cv.visitField(ACC_PUBLIC + ACC_STATIC, markerAlreadyTransformed, "Z", null, null)
                            .visitEnd();
                }
                super.visitEnd();
            }

            @Override
            public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                    String[] exceptions) {

                // Handle changing SessionImplementor parameter to SharedSessionContractImplementor
                boolean rewriteSessionImplementor = false;
                final String descOrig = desc;

                logger.tracef("method %s, description %s, signature %s", name, desc, signature);
                if (parentClassesAndInterfaces.contains("org/hibernate/usertype/UserType")) {
                    if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeSet")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;ILorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/usertype/CompositeUserType")) {
                    if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeSet")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;ILorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("assemble")
                            && "(Ljava/io/Serializable;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("disassemble")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/io/Serializable;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("replace")
                            && "(Ljava/lang/Object;Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }
                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/usertype/UserCollectionType")) {
                    if (name.equals("instantiate")
                            && "(Lorg/hibernate/engine/spi/SessionImplementor;Lorg/hibernate/persister/collection/CollectionPersister;)Lorg/hibernate/collection/spi/PersistentCollection;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("replaceElements")
                            && "(Ljava/lang/Object;Ljava/lang/Object;Lorg/hibernate/persister/collection/CollectionPersister;Ljava/lang/Object;Ljava/util/Map;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("wrap")
                            && "(Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Lorg/hibernate/collection/spi/PersistentCollection;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/usertype/UserVersionType")) {
                    if (name.equals("seed")
                            && "(Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("next")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/type/Type")) {
                    if (name.equals("assemble")
                            && "(Ljava/io/Serializable;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("disassemble")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/io/Serializable;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("beforeAssemble")
                            && "(Ljava/io/Serializable;Lorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("hydrate")
                            && "(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("isDirty")
                            && "(Ljava/lang/Object;Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;)Z"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("isDirty")
                            && "(Ljava/lang/Object;Ljava/lang/Object;[ZLorg/hibernate/engine/spi/SessionImplementor;)Z"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("isModified")
                            && "(Ljava/lang/Object;Ljava/lang/Object;[ZLorg/hibernate/engine/spi/SessionImplementor;)Z"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeSet")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;I[ZLorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeSet")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;ILorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("replace")
                            && "(Ljava/lang/Object;Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("replace")
                            && "(Ljava/lang/Object;Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;Ljava/util/Map;Lorg/hibernate/type/ForeignKeyDirection;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("resolve")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("resolve")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;Ljava/lang/Boolean;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("semiResolve")
                            && "(Ljava/lang/Object;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/type/SingleColumnType")) {
                    if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("get")
                            && "(Ljava/sql/ResultSet;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("set")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;ILorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/type/AbstractStandardBasicType")) {
                    if (name.equals("get")
                            && "(Ljava/sql/ResultSet;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("nullSafeGet")
                            && "(Ljava/sql/ResultSet;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)Ljava/lang/Object;"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("set")
                            && "(Ljava/sql/PreparedStatement;Ljava/lang/Object;ILorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces
                        .contains("org/hibernate/type/ProcedureParameterExtractionAware")) {
                    if (name.equals("extract") && (desc.startsWith(
                            "(Ljava/sql/CallableStatement;ILorg/hibernate/engine/spi/SessionImplementor;)")
                            || desc.startsWith(
                                    "(Ljava/sql/CallableStatement;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)"))) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/type/ProcedureParameterNamedBinder")) {
                    if (name.equals("nullSafeSet")
                            && "(Ljava/sql/CallableStatement;Ljava/lang/Object;Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;)V"
                                    .equals(desc)) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/type/VersionType")) {
                    if (name.equals("seed")
                            && desc.startsWith("(Lorg/hibernate/engine/spi/SessionImplementor;)")) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("next")
                            && desc.contains("Lorg/hibernate/engine/spi/SessionImplementor;")) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (parentClassesAndInterfaces.contains("org/hibernate/collection/spi/PersistentCollection")) {
                    if (name.equals("unsetSession")
                            && desc.equals("(Lorg/hibernate/engine/spi/SessionImplementor;)Z")) {
                        desc = replaceSessionImplementor(desc);
                    } else if (name.equals("setCurrentSession")
                            && desc.equals("(Lorg/hibernate/engine/spi/SessionImplementor;)Z")) {
                        desc = replaceSessionImplementor(desc);
                    }

                    rewriteSessionImplementor = true;
                }

                if (rewriteSessionImplementor && name.equals("<init>")) {
                    // update constructor methods to use SharedSessionContractImplementor instead of SessionImplementor
                    desc = replaceSessionImplementor(desc);
                }

                if (descOrig != desc) { // if we are changing from type SessionImplementor to SharedSessionContractImplementor
                    // mark the class as transformed
                    transformedState.setClassTransformed(true);
                }
                return new MethodAdapter(rewriteSessionImplementor, Opcodes.ASM6,
                        super.visitMethod(access, name, desc, signature, exceptions), getModuleName(loader),
                        className, transformedState);
            }
        }, 0);
        if (!transformedState.transformationsMade()) {
            // no change was actually made, indicate so by returning null
            return null;
        }
        return classWriter.toByteArray();
    } finally {
        if (tracePrintWriter != null) {
            tracePrintWriter.close();
        }
    }
}

From source file:org.springframework.cglib.core.ClassNameReader.java

License:Apache License

@SuppressWarnings("unchecked")
public static String[] getClassInfo(ClassReader r) {
    final List array = new ArrayList();
    try {/* ww  w  .  j  a va  2  s . c o  m*/
        r.accept(new ClassVisitor(Opcodes.ASM4, 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:rubah.bytecode.transformers.ProxyGenerator.java

License:Open Source License

public byte[] generateProxy(String name) {
    final String proxyName = name.replace('.', '/');

    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);

    HashMap<Object, String> namesMap = new HashMap<Object, String>();
    HashMap<String, Object> objectsMap = new HashMap<String, Object>();

    //      Map<Pair<Clazz, Method>, Integer> overloads = this.computeInheritedOverloads(this.version.getOverloads());

    ClassVisitor visitor = writer;//  w  w w .  j ava  2 s  .  com

    visitor = new ReplaceUniqueByOriginalNames(namesMap, objectsMap, this.version.getNamespace(), visitor);

    visitor = new UpdatableClassRenamer(this.version, objectsMap, visitor);
    visitor = this.getMethodsTransformer(proxyName, this.thisClass, visitor);
    // The placement of this transformer is important
    // because convert methods require special treatment
    // as they operate in between versions
    if (this.version.getPrevious() != null) {
        UpdateClass updateClass = VersionManager.getInstance().getUpdateClass(this.version);
        visitor = new ProcessUpdateClass(objectsMap, this.version, updateClass, visitor);
        visitor = new ClassVisitor(ASM5, visitor) {
            @Override
            public void visitEnd() {

                Type t = thisClass.getASMType();
                String updatableName = version.getUpdatableName(t.getClassName());

                if (updatableName != null) {
                    Type t1 = Type.getObjectType(updatableName.replace('.', '/'));

                    String prevName = version.getPrevious().getUpdatableName(t.getClassName());

                    MethodVisitor mv = this.cv.visitMethod(ACC_PUBLIC, "convert",
                            Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE, OBJECT_TYPE), null, null);

                    if (prevName != null) {
                        Type t0 = Type.getObjectType(
                                version.getPrevious().getUpdatableName(t.getClassName()).replace('.', '/'));

                        mv.visitVarInsn(ALOAD, 1);
                        mv.visitTypeInsn(CHECKCAST, t0.getInternalName());
                        mv.visitVarInsn(ALOAD, 2);
                        mv.visitTypeInsn(CHECKCAST, t1.getInternalName());

                        mv.visitMethodInsn(INVOKESTATIC, proxyName, ProcessUpdateClass.METHOD_NAME_STATIC,
                                Type.getMethodDescriptor(Type.VOID_TYPE, t0, t1), false);

                        mv.visitInsn(RETURN);

                    } else {
                        // Class was introduced this version
                        mv.visitTypeInsn(NEW, "java/lang/Error");
                        mv.visitInsn(DUP);
                        mv.visitLdcInsn(
                                "Should not execute, converting a class that did not exist in the previous version");
                        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Error", "<init>", "(Ljava/lang/String;)V",
                                false);
                        mv.visitInsn(ATHROW);
                    }

                    mv.visitMaxs(0, 0);
                    mv.visitEnd();
                }

                this.cv.visitEnd();
            }
        };
    }
    //      visitor = new RenameOverloads(objectsMap, overloads, this.version.getNamespace(), visitor);
    //      visitor = new TypeEraser(objectsMap, this.version, visitor);
    visitor = new AddGettersAndSetters(objectsMap, this.version.getNamespace(), visitor)
            .setGenerateInheritedFields(true);
    visitor = new ReplaceOriginalNamesByUnique(namesMap, objectsMap, this.version.getNamespace(), visitor);

    visitor = new OverrideInheritedMethods(this.thisClass, visitor);

    visitor.visit(V1_5, CLASS_ACCESS, this.thisClass.getASMType().getInternalName(), null, null, null);

    visitor.visitEnd();
    return writer.toByteArray();
}

From source file:uk.ac.cam.cl.dtg.teaching.programmingtest.java.bytecode.InstructionCounterTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) {

    String dottedName = className.replace("/", ".");

    if (!isTransformable(dottedName)) {
        return classfileBuffer;
    }/* ww  w . jav  a 2s  .co m*/

    ClassWriter classWriter = new ClassWriter(0);
    ClassReader classReader = new ClassReader(classfileBuffer);
    ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) {
        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
            if (mv != null) {
                return new InstructionCounterMethodAdapter(mv);
            } else {
                return null;
            }
        }
    };
    try {
        classReader.accept(classVisitor, 0);
        return classWriter.toByteArray();
    } catch (InstrumentationUnsafeError e) {
        if (isAllowedUnsafe(dottedName)) {
            return classfileBuffer;
        } else {
            throw e;
        }
    }
}

From source file:uk.ac.cam.cl.dtg.teaching.programmingtest.java.bytecode.MethodParameterTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) {

    Map<String, Method> classMap = toTrack.get(className.replace("/", "."));
    if (classMap != null) {
        ClassWriter classWriter = new ClassWriter(Opcodes.ASM5);
        ClassReader classReader = new ClassReader(classfileBuffer);
        ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) {
            @Override/* www .  j  a  v a2s  .  c  om*/
            public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                    String[] exceptions) {
                MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
                Method method = classMap.get(name);
                if (method == null) {
                    return mv;
                }
                if (mv != null) {
                    return new TrackMethodVisitor(mv, method);
                }
                return null;
            }
        };
        classReader.accept(classVisitor, 0);
        return classWriter.toByteArray();
    }
    return classfileBuffer;
}