List of usage examples for org.objectweb.asm ClassVisitor ClassVisitor
public ClassVisitor(final int api, final ClassVisitor classVisitor)
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; }