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