Example usage for org.objectweb.asm MethodVisitor MethodVisitor

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

Introduction

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

Prototype

public MethodVisitor(final int api, final MethodVisitor methodVisitor) 

Source Link

Document

Constructs a new MethodVisitor .

Usage

From source file:com.github.antag99.retinazer.weaver.SystemProcessor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    if ((access & ACC_STATIC) != 0 || (access & ACC_ABSTRACT) != 0)
        return super.visitMethod(access, name, desc, signature, exceptions);

    final MethodNode methodNode = new MethodNode(access, name, desc, signature, exceptions);

    return new MethodVisitor(ASM5, methodNode) {
        @Override//from   ww  w .  j  av a 2  s.  c  om
        public void visitEnd() {
            super.visitEnd();
            processMethod(methodNode);

            if (name.equals("setup") && desc.equals("()V"))
                setupMethod = methodNode;
            else
                methodNode.accept(SystemProcessor.super.visitMethod(access, name, desc, signature, exceptions));
        }
    };
}

From source file:com.github.bmsantos.core.cola.injector.InfoClassVisitor.java

License:Apache License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    methodName = name;//w  w w .j av  a  2 s. c  om

    final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    return new MethodVisitor(ASM4, mv) {
        @Override
        public AnnotationVisitor visitAnnotation(final String descriptor, final boolean runtimeVisible) {
            if (descriptor.equals(IDE_ENABLER_DESCRIPTOR)) {
                ideEnabledMethods.add(methodName);
            }
            return super.visitAnnotation(descriptor, runtimeVisible);
        }
    };
}

From source file:com.github.megatronking.stringfog.plugin.StringFogClassVisitor.java

License:Apache License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    if (mv != null && !mIgnoreClass) {
        if ("<clinit>".equals(name)) {
            isClInitExists = true;/*from ww  w .  j a  v a2 s  . c  o m*/
            // If clinit exists meaning the static fields (not final) would have be inited here.
            mv = new MethodVisitor(Opcodes.ASM5, mv) {

                private String lastStashCst;

                @Override
                public void visitCode() {
                    super.visitCode();
                    // Here init static final fields.
                    for (ClassStringField field : mStaticFinalFields) {
                        if (!canEncrypted(field.value)) {
                            continue;
                        }
                        String originValue = field.value;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                        super.visitFieldInsn(Opcodes.PUTSTATIC, mClassName, field.name,
                                ClassStringField.STRING_DESC);
                    }
                }

                @Override
                public void visitLdcInsn(Object cst) {
                    // Here init static or static final fields, but we must check field name int 'visitFieldInsn'
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        lastStashCst = (String) cst;
                        String originValue = lastStashCst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                    } else {
                        lastStashCst = null;
                        super.visitLdcInsn(cst);
                    }
                }

                @Override
                public void visitFieldInsn(int opcode, String owner, String name, String desc) {
                    if (mClassName.equals(owner) && lastStashCst != null) {
                        boolean isContain = false;
                        for (ClassStringField field : mStaticFields) {
                            if (field.name.equals(name)) {
                                isContain = true;
                                break;
                            }
                        }
                        if (!isContain) {
                            for (ClassStringField field : mStaticFinalFields) {
                                if (field.name.equals(name) && field.value == null) {
                                    field.value = lastStashCst;
                                    break;
                                }
                            }
                        }
                    }
                    lastStashCst = null;
                    super.visitFieldInsn(opcode, owner, name, desc);
                }
            };

        } else if ("<init>".equals(name)) {
            // Here init final(not static) and normal fields
            mv = new MethodVisitor(Opcodes.ASM5, mv) {
                @Override
                public void visitLdcInsn(Object cst) {
                    // We don't care about whether the field is final or normal
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        String originValue = (String) cst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                    } else {
                        super.visitLdcInsn(cst);
                    }
                }
            };
        } else {
            mv = new MethodVisitor(Opcodes.ASM5, mv) {

                @Override
                public void visitLdcInsn(Object cst) {
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        // If the value is a static final field
                        for (ClassStringField field : mStaticFinalFields) {
                            if (cst.equals(field.value)) {
                                super.visitFieldInsn(Opcodes.GETSTATIC, mClassName, field.name,
                                        ClassStringField.STRING_DESC);
                                return;
                            }
                        }
                        // If the value is a final field (not static)
                        for (ClassStringField field : mFinalFields) {
                            // if the value of a final field is null, we ignore it
                            if (cst.equals(field.value)) {
                                super.visitVarInsn(Opcodes.ALOAD, 0);
                                super.visitFieldInsn(Opcodes.GETFIELD, mClassName, field.name,
                                        "Ljava/lang/String;");
                                return;
                            }
                        }
                        // local variables
                        String originValue = (String) cst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                        return;
                    }
                    super.visitLdcInsn(cst);
                }

            };
        }
    }
    return mv;
}

From source file:com.github.projectsandstone.asmmeta.asm.ASMMetaClassVisitor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MetaElement<?> mElement;//  w ww .j a  v a 2  s  .  c o m

    if (name.equals("<init>") || name.equals("<clinit>")) {
        mElement = new ConstructorElement(this.current, access, name, signature, new MetaData(),
                this.resolvers.getConstructorResolver());
    } else {
        mElement = new MethodElement(this.current, access, name, signature, new MetaData(),
                this.resolvers.getMethodResolver());
    }

    this.addToEnclosing(mElement);

    return new MethodVisitor(Opcodes.ASM5, super.visitMethod(access, name, desc, signature, exceptions)) {
        @Override
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            AnnotationElement annotationElement = createAnnotationElement(mElement, desc);

            mElement.getMetaData().getAnnotationList().add(annotationElement);

            return new ASMMetaAnnotationVisitor(this.api, super.visitAnnotation(desc, visible),
                    annotationElement, annotationElement.getValues());
        }

        @Override
        public void visitEnd() {
            mElement.immutate();
            super.visitEnd();
        }
    };
}

From source file:com.heliosdecompiler.appifier.Appifier.java

License:Apache License

private static byte[] transform(byte[] classBytes) {
    ClassReader reader = new ClassReader(classBytes);
    ClassWriter writer = new ClassWriter(Opcodes.ASM5);

    reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
        @Override//from w  ww .  j av  a 2 s .c om
        public MethodVisitor visitMethod(int i, String s, String s1, String s2, String[] strings) {
            return new MethodVisitor(Opcodes.ASM5, writer.visitMethod(i, s, s1, s2, strings)) {
                @Override
                public void visitFieldInsn(int opcode, String owner, String name, String desc) {
                    if (opcode == Opcodes.GETSTATIC) {
                        if (owner.equals("java/lang/System")) {
                            if (desc.equals("Ljava/io/PrintStream;")) {
                                if (name.equals("out")) {
                                    super.visitFieldInsn(Opcodes.GETSTATIC,
                                            "com/heliosdecompiler/appifier/SystemHook", "out",
                                            "Ljava/lang/ThreadLocal;");
                                    super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/ThreadLocal", "get",
                                            "()Ljava/lang/Object;", false);
                                    super.visitTypeInsn(Opcodes.CHECKCAST, "java/io/PrintStream");
                                    return;
                                } else if (name.equals("err")) {
                                    super.visitFieldInsn(Opcodes.GETSTATIC,
                                            "com/heliosdecompiler/appifier/SystemHook", "err",
                                            "Ljava/lang/ThreadLocal;");
                                    super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/ThreadLocal", "get",
                                            "()Ljava/lang/Object;", false);
                                    super.visitTypeInsn(Opcodes.CHECKCAST, "java/io/PrintStream");
                                    return;
                                }
                            }
                        }
                    }
                    super.visitFieldInsn(opcode, owner, name, desc);
                }
            };
        }
    }, 0);

    return writer.toByteArray();
}

From source file:com.intellij.compiler.notNullVerification.NotNullVerifyingInstrumenter.java

License:Apache License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    final Type[] args = Type.getArgumentTypes(desc);
    final Type returnType = Type.getReturnType(desc);
    final MethodVisitor v = cv.visitMethod(access, name, desc, signature, exceptions);
    return new MethodVisitor(Opcodes.ASM5, v) {

        private final List<Integer> myNotNullParams = new ArrayList<Integer>();
        private int mySyntheticCount = 0;
        private boolean myIsNotNull = false;
        private Label myStartGeneratedCodeLabel;

        @Override//from   www  . ja v a2s.  c o  m
        public AnnotationVisitor visitParameterAnnotation(final int parameter, final String anno,
                final boolean visible) {
            final AnnotationVisitor av = mv.visitParameterAnnotation(parameter, anno, visible);
            if (isReferenceType(args[parameter]) && anno.equals(NOT_NULL_TYPE)) {
                myNotNullParams.add(parameter);
            } else if (anno.equals(SYNTHETIC_TYPE)) {
                // see http://forge.ow2.org/tracker/?aid=307392&group_id=23&atid=100023&func=detail
                mySyntheticCount++;
            }
            return av;
        }

        @Override
        public AnnotationVisitor visitAnnotation(String anno, boolean isRuntime) {
            final AnnotationVisitor av = mv.visitAnnotation(anno, isRuntime);
            if (isReferenceType(returnType) && anno.equals(NOT_NULL_TYPE)) {
                myIsNotNull = true;
            }

            return av;
        }

        @Override
        public void visitCode() {
            if (myNotNullParams.size() > 0) {
                myStartGeneratedCodeLabel = new Label();
                mv.visitLabel(myStartGeneratedCodeLabel);
            }
            for (Integer param : myNotNullParams) {
                int var = ((access & ACC_STATIC) == 0) ? 1 : 0;
                for (int i = 0; i < param; ++i) {
                    var += args[i].getSize();
                }
                mv.visitVarInsn(ALOAD, var);

                Label end = new Label();
                mv.visitJumpInsn(IFNONNULL, end);

                generateThrow(IAE_CLASS_NAME,
                        String.format(NULL_ARG_MESSAGE, param - mySyntheticCount, myClassName, name), end);
            }
        }

        @Override
        public void visitLocalVariable(final String name, final String desc, final String signature,
                final Label start, final Label end, final int index) {
            final boolean isStatic = (access & ACC_STATIC) != 0;
            final boolean isParameter = isStatic ? index < args.length : index <= args.length;
            final Label label = (isParameter && myStartGeneratedCodeLabel != null) ? myStartGeneratedCodeLabel
                    : start;
            mv.visitLocalVariable(name, desc, signature, label, end, index);
        }

        @Override
        public void visitInsn(int opcode) {
            if (opcode == ARETURN) {
                if (myIsNotNull) {
                    mv.visitInsn(DUP);
                    final Label skipLabel = new Label();
                    mv.visitJumpInsn(IFNONNULL, skipLabel);
                    generateThrow(ISE_CLASS_NAME, String.format(NULL_RESULT_MESSAGE, myClassName, name),
                            skipLabel);
                }
            }

            mv.visitInsn(opcode);
        }

        private void generateThrow(final String exceptionClass, final String descr, final Label end) {
            mv.visitTypeInsn(NEW, exceptionClass);
            mv.visitInsn(DUP);
            mv.visitLdcInsn(descr);
            mv.visitMethodInsn(INVOKESPECIAL, exceptionClass, CONSTRUCTOR_NAME, EXCEPTION_INIT_SIGNATURE);
            mv.visitInsn(ATHROW);
            mv.visitLabel(end);

            myIsModification = true;
            processPostponedErrors();
        }

        @Override
        public void visitMaxs(final int maxStack, final int maxLocals) {
            try {
                super.visitMaxs(maxStack, maxLocals);
            } catch (Throwable e) {
                registerError(name, "visitMaxs", e);
            }
        }
    };
}

From source file:com.navercorp.pinpoint.profiler.instrument.lambda.MethodInstReplacer.java

License:Apache License

@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature,
        String[] exceptions) {/*from   w  w  w .  java  2s .c om*/
    if (methodName.equals(name)) {
        logger.info("visitMethod {} desc:{} {}", name, descriptor);

        final MethodVisitor superMethodVisitor = super.visitMethod(access, name, descriptor, signature,
                exceptions);
        return new MethodVisitor(ASMVersion.VERSION, superMethodVisitor) {
            @Override
            public void visitMethodInsn(int opcode, String owner, String name, String descriptor,
                    boolean isInterface) {
                if (targetClassName.equals(owner) && targetMethodName.equals(name)) {
                    if (logger.isInfoEnabled()) {
                        logger.info("replace MethodInsn {}.{}() -> {}.{}()", owner, name, delegateClassName,
                                delegateMethodName);
                    }
                    transformCount++;
                    super.visitMethodInsn(Opcodes.INVOKESTATIC, delegateClassName, delegateMethodName,
                            descriptor, isInterface);
                } else {
                    super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
                }
            }
        };
    }
    return super.visitMethod(access, name, descriptor, signature, exceptions);
}

From source file:com.quartercode.jtimber.rh.agent.asm.InsertJAXBTweaksClassAdapter.java

License:Open Source License

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

    // If the method is called afterUnmarshal(), insert a call to another method afterUnmarshal_jtimber() as the first instruction and set containsCustomAfterUnmarshalMethod to true
    // Otherwise, just delegate the method to the next class visitor
    if (name.endsWith("afterUnmarshal")) {
        containsCustomAfterUnmarshalMethod = true;

        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
        if (mv != null) {
            mv = new MethodVisitor(ASM5, mv) {

                @Override//from   w w  w .  j  ava  2  s  . c o  m
                public void visitCode() {

                    super.visitCode();

                    // Push this
                    super.visitVarInsn(ALOAD, 0);
                    // Push both arguments
                    super.visitVarInsn(ALOAD, 1);
                    super.visitVarInsn(ALOAD, 2);
                    // Invoke the method
                    super.visitMethodInsn(INVOKEVIRTUAL, classType.getInternalName(),
                            ADDED_AFTER_UNMARSHAL_METHOD.getName(),
                            ADDED_AFTER_UNMARSHAL_METHOD.getDescriptor(), false);
                }

            };
        }
        return mv;
    } else {
        return super.visitMethod(access, name, desc, signature, exceptions);
    }
}

From source file:com.sun.tdk.jcov.instrument.DeferringMethodClassAdapter.java

License:Open Source License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    if (!params.isInstrumentSynthetic() && (access & ACC_SYNTHETIC) != 0) {
        return super.visitMethod(access, name, desc, signature, exceptions);
        //            return null;
    }//from  w  w  w. j av  a 2 s  .c o m
    MethodVisitor mv = visitMethodCoverage(access, name, desc, signature, exceptions);

    if ("<clinit>".equals(name) && !params.isDynamicCollect()
            && (k.getPackageName().startsWith("java/lang/"))) {
        mv = new MethodVisitor(Opcodes.ASM4, mv) {
            public void visitCode() {
                mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/Collect", "init", "()V");
                super.visitCode();
            }
        };
    }

    if (params.isCallerFilterOn() && params.isCallerFilterAccept(k.getFullname())
            && !params.isDynamicCollect()) {

        if (name.equals("<clinit>")) {
            int id = (name + desc).hashCode();
            mv.visitLdcInsn(id);
            mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/CollectDetect", "setExpected", "(I)V");
        }

    }

    if (params.isInnerInvacationsOff() && Utils.isAdvanceStaticInstrAllowed(k.getFullname(), name)) {

        if (name.equals("<clinit>")) {
            mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/CollectDetect", "enterClinit", "()V");
        }

    }

    // System.out.println("Seeing " + k.fullname + "." + name);
    if (params.isDataSaveFilterAccept(k.getFullname(), name, true)) {
        mv = new SavePointsMethodAdapter(mv, true);
    }

    if (params.isDataSaveFilterAccept(k.getFullname(), name, false)) {
        mv = new SavePointsMethodAdapter(mv, false);
    }
    mv = new MethodVisitor(Opcodes.ASM4, mv) {
        @Override
        public void visitLocalVariable(String arg0, String arg1, String arg2, Label arg3, Label arg4,
                int arg5) {
            //super.visitLocalVariable(arg0, arg1, arg2, arg3, arg4, arg5);
        }
    };
    if (params.isDynamicCollect()) {
        mv = new InvokeMethodAdapter(mv, k.getFullname(), params);
    } else {
        mv = new StaticInvokeMethodAdapter(mv, k.getFullname(), name, access, params);
    }
    return mv;
}

From source file:com.tencent.tinker.build.immutable.ClassSimDef.java

License:Open Source License

public void init() {
    methodCount = 0;/*from  w  w  w . ja  v  a2s . c  om*/
    fieldCount = 0;

    ClassReader cr = new ClassReader(bytes);
    ClassVisitor cv = new ClassVisitor(Opcodes.ASM4) {
        String className;

        @Override
        public void visit(int version, int access, String name, String signature, String superName,
                String[] interfaces) {
            className = name;
            super.visit(version, access, name, signature, superName, interfaces);
        }

        @Override
        public MethodVisitor visitMethod(int access, String mtdName, String mtdDesc, String mtdSig,
                String[] exceptions) {

            String defMtd = className + ":" + mtdName + ":" + mtdDesc;
            if (!refMtdSet.contains(defMtd)) {
                refMtdSet.add(defMtd);
                methodCount++;
            }

            MethodVisitor mv = super.visitMethod(access, mtdName, mtdDesc, mtdSig, exceptions);
            mv = new MethodVisitor(Opcodes.ASM4, mv) {
                @Override
                public void visitFieldInsn(int opcode, String owner, String fName, String fDesc) {
                    String invokeField = owner + ":" + fName + ":" + fDesc;
                    if (!refFieldSet.contains(invokeField)) {
                        refFieldSet.add(invokeField);
                        fieldCount++;
                    }
                    super.visitFieldInsn(opcode, owner, fName, fDesc);
                }

                @Override
                public void visitMethodInsn(int opcode, String owner, String mName, String mDesc) {
                    String invokeMtd = owner + ":" + mName + ":" + mDesc;
                    if (!refMtdSet.contains(invokeMtd)) {
                        refMtdSet.add(invokeMtd);
                        methodCount++;
                    }
                    super.visitMethodInsn(opcode, owner, mName, mDesc);
                }
            };
            return mv;
        }

        @Override
        public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
            String fieldDesc = className + ":" + name + ":" + desc;
            if (!refFieldSet.contains(fieldDesc)) {
                refFieldSet.add(fieldDesc);
                fieldCount++;
            }
            return super.visitField(access, name, desc, signature, value);
        }
    };
    cr.accept(cv, 0);
}