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:com.google.devtools.build.android.desugar.Bug62456849TestDataGenerator.java

License:Open Source License

private static byte[] convertClass(ZipFile file, ZipEntry entry) throws IOException {
    try (InputStream content = file.getInputStream(entry)) {
        ClassReader reader = new ClassReader(content);
        ClassWriter writer = new ClassWriter(0);
        ClassVisitor converter = new ClassVisitor(Opcodes.ASM5, writer) {
            @Override/*from  w  w  w  .  j  av a 2  s  .com*/
            public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                    String[] exceptions) {
                if (name.startsWith("lambda$") && (access & Opcodes.ACC_SYNTHETIC) == 0) {
                    access |= Opcodes.ACC_SYNTHETIC;
                }
                return super.visitMethod(access, name, desc, signature, exceptions);
            }
        };
        reader.accept(converter, 0);
        return writer.toByteArray();
    }
}

From source file:com.googlecode.d2j.dex.Dex2jar.java

License:Apache License

private void doTranslate(final Path dist) throws IOException {

    DexFileNode fileNode = new DexFileNode();
    try {// ww w  . j ava 2  s. co m
        reader.accept(fileNode, readerConfig | DexFileReader.IGNORE_READ_EXCEPTION);
    } catch (Exception ex) {
        exceptionHandler.handleFileException(ex);
    }
    ClassVisitorFactory cvf = new ClassVisitorFactory() {
        @Override
        public ClassVisitor create(final String name) {
            return new ClassVisitor(Opcodes.ASM4, new ClassWriter(ClassWriter.COMPUTE_MAXS)) {
                @Override
                public void visitEnd() {
                    super.visitEnd();
                    ClassWriter cw = (ClassWriter) super.cv;

                    byte[] data;
                    try {
                        // FIXME handle 'java.lang.RuntimeException: Method code too large!'
                        data = cw.toByteArray();
                    } catch (Exception ex) {
                        System.err.println(String.format("ASM fail to generate .class file: %s", name));
                        exceptionHandler.handleFileException(ex);
                        return;
                    }
                    try {
                        Path dist1 = dist.resolve(name + ".class");
                        Path parent = dist1.getParent();
                        if (parent != null && !Files.exists(parent)) {
                            Files.createDirectories(parent);
                        }
                        Files.write(dist1, data);
                    } catch (IOException e) {
                        e.printStackTrace(System.err);
                    }
                }
            };
        }
    };

    new ExDex2Asm(exceptionHandler) {
        public void convertCode(DexMethodNode methodNode, MethodVisitor mv) {
            if ((readerConfig & DexFileReader.SKIP_CODE) != 0
                    && methodNode.method.getName().equals("<clinit>")) {
                // also skip clinit
                return;
            }
            super.convertCode(methodNode, mv);
        }

        @Override
        public void optimize(IrMethod irMethod) {
            T_exceptionFix.transform(irMethod);
            T_endRemove.transform(irMethod);
            T_cleanLabel.transform(irMethod);
            if (0 != (v3Config & V3.TOPOLOGICAL_SORT)) {
                // T_topologicalSort.transform(irMethod);
            }
            T_ssa.transform(irMethod);
            T_removeLocal.transform(irMethod);
            T_removeConst.transform(irMethod);
            T_zero.transform(irMethod);
            if (T_npe.transformReportChanged(irMethod)) {
                T_deadCode.transform(irMethod);
                T_removeLocal.transform(irMethod);
                T_removeConst.transform(irMethod);
            }
            T_new.transform(irMethod);
            T_fillArray.transform(irMethod);
            T_agg.transform(irMethod);
            T_voidInvoke.transform(irMethod);
            if (0 != (v3Config & V3.PRINT_IR)) {
                int i = 0;
                for (Stmt p : irMethod.stmts) {
                    if (p.st == Stmt.ST.LABEL) {
                        LabelStmt labelStmt = (LabelStmt) p;
                        labelStmt.displayName = "L" + i++;
                    }
                }
                System.out.println(irMethod);
            }
            T_type.transform(irMethod);
            T_unssa.transform(irMethod);
            T_ir2jRegAssign.transform(irMethod);
            T_trimEx.transform(irMethod);
        }

        @Override
        public void ir2j(IrMethod irMethod, MethodVisitor mv) {
            new IR2JConverter(0 != (V3.OPTIMIZE_SYNCHRONIZED & v3Config)).convert(irMethod, mv);
        }
    }.convertDex(fileNode, cvf);

}

From source file:com.googlecode.dex2jar.tools.Dex2jarMultiThreadCmd.java

License:Apache License

private void run0(String fileName, final ExecutorService executorService) throws IOException {
    // long baseTS = System.currentTimeMillis();
    String baseName = getBaseName(new File(fileName).toPath());
    Path currentDir = new File(".").toPath();
    Path file = currentDir.resolve(baseName + "-dex2jar.jar");
    final Path errorFile = currentDir.resolve(baseName + "-error.zip");
    System.err.println("dex2jar " + fileName + " -> " + file);
    final BaksmaliBaseDexExceptionHandler exceptionHandler = new BaksmaliBaseDexExceptionHandler();
    DexFileReader reader = new DexFileReader(ZipUtil.readDex(new File(fileName)));
    DexFileNode fileNode = new DexFileNode();
    try {/*from  w  w w.j ava 2s .c  o  m*/
        reader.accept(fileNode, DexFileReader.SKIP_DEBUG | DexFileReader.IGNORE_READ_EXCEPTION);
    } catch (Exception ex) {
        exceptionHandler.handleFileException(ex);
        throw ex;
    }
    final FileSystem fs = createZip(file);
    final Path dist = fs.getPath("/");
    ClassVisitorFactory cvf = new ClassVisitorFactory() {
        @Override
        public ClassVisitor create(final String name) {
            return new ClassVisitor(Opcodes.ASM4, new ClassWriter(ClassWriter.COMPUTE_MAXS)) {
                @Override
                public void visitEnd() {
                    super.visitEnd();
                    ClassWriter cw = (ClassWriter) super.cv;

                    byte[] data;
                    try {
                        // FIXME handle 'java.lang.RuntimeException: Method code too large!'
                        data = cw.toByteArray();
                    } catch (Exception ex) {
                        System.err.println(String.format("ASM fail to generate .class file: %s", name));
                        exceptionHandler.handleFileException(ex);
                        return;
                    }
                    try {
                        Path dist1 = dist.resolve(name + ".class");
                        BaseCmd.createParentDirectories(dist1);
                        Files.write(dist1, data);
                    } catch (IOException e) {
                        exceptionHandler.handleFileException(e);
                    }
                }
            };
        }
    };

    new ExDex2Asm(exceptionHandler) {

        @Override
        public void convertDex(DexFileNode fileNode, final ClassVisitorFactory cvf) {
            if (fileNode.clzs != null) {
                final Map<String, Clz> classes = collectClzInfo(fileNode);
                final List<Future<?>> results = new ArrayList<>(fileNode.clzs.size());
                for (final DexClassNode classNode : fileNode.clzs) {
                    results.add(executorService.submit(new Runnable() {
                        @Override
                        public void run() {
                            convertClass(classNode, cvf, classes);
                        }
                    }));
                }
                executorService.submit(new Runnable() {
                    @Override
                    public void run() {
                        for (Future<?> result : results) {
                            try {
                                result.get();
                            } catch (InterruptedException | ExecutionException e) {
                                e.printStackTrace();
                            }
                        }
                        BaksmaliBaseDexExceptionHandler exceptionHandler1 = (BaksmaliBaseDexExceptionHandler) exceptionHandler;
                        if (exceptionHandler1.hasException()) {
                            exceptionHandler1.dump(errorFile, new String[0]);
                        }
                        try {
                            fs.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    }.convertDex(fileNode, cvf);
}

From source file:com.googlecode.dex2jar.tools.JarAccessCmd.java

License:Apache License

@Override
protected void doCommandLine() throws Exception {
    if (remainingArgs.length != 1) {
        usage();/*from   w ww .  j  a  v a2  s.c om*/
        return;
    }

    Path jar = new File(remainingArgs[0]).toPath();
    if (!Files.exists(jar)) {
        System.err.println(jar + " is not exists");
        usage();
        return;
    }

    if (output == null) {
        if (Files.isDirectory(jar)) {
            output = new File(jar.getFileName() + "-access.jar").toPath();
        } else {
            output = new File(getBaseName(jar.getFileName().toString()) + "-access.jar").toPath();
        }
    }

    if (Files.exists(output) && !forceOverwrite) {
        System.err.println(output + " exists, use --force to overwrite");
        usage();
        return;
    }

    final int rf = ~str2acc(removeFieldAccess);
    final int rm = ~str2acc(removeMethodAccess);
    final int rc = ~str2acc(removeClassAccess);

    final int af = str2acc(addFieldAccess);
    final int am = str2acc(addMethodAccess);
    final int ac = str2acc(addClassAccess);

    final int flags = removeDebug ? ClassReader.SKIP_DEBUG : 0;

    try (FileSystem outFileSystem = createZip(output)) {
        final Path outRoot = outFileSystem.getPath("/");
        walkJarOrDir(jar, new FileVisitorX() {
            @Override
            public void visitFile(Path file, Path relative) throws IOException {
                if (file.getFileName().toString().endsWith(".class")) {

                    final ClassReader r = new ClassReader(Files.readAllBytes(file));

                    ClassWriter cr = new ClassWriter(0);
                    r.accept(new ClassVisitor(ASM4, cr) {

                        @Override
                        public void visit(int version, int access, String name, String signature,
                                String superName, String[] interfaces) {
                            int na = (access & rc) | ac;
                            if (access != na) {
                                System.out.println("c " + name);
                            }
                            super.visit(version, na, name, signature, superName, interfaces);
                        }

                        @Override
                        public FieldVisitor visitField(int access, String name, String desc, String signature,
                                Object value) {
                            int na = (access & rf) | af;
                            if (na != access) {
                                System.out.println("f " + r.getClassName() + "." + name);
                            }
                            return super.visitField(na, name, desc, signature, value);
                        }

                        @Override
                        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                                String[] exceptions) {
                            int na = (access & rm) | am;
                            if (na != access) {
                                System.out.println("m " + r.getClassName() + "." + name + desc);
                            }
                            return super.visitMethod(na, name, desc, signature, exceptions);
                        }

                    }, flags | ClassReader.EXPAND_FRAMES);
                    Files.write(outRoot.resolve(relative), cr.toByteArray());

                } else {
                    Files.copy(file, outRoot.resolve(relative));
                }
            }
        });
    }
}

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  a v a 2  s . c o  m
        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.ifedorenko.m2e.sourcelookup.javaagent.ClassfileTransformer.java

License:Open Source License

public byte[] transform(byte[] classfileBuffer, final String location) {

    final ClassReader r = new ClassReader(classfileBuffer, 0, classfileBuffer.length);
    final ClassWriter w = new ClassWriter(0);

    r.accept(new ClassVisitor(Opcodes.ASM5, w) {
        public void visitSource(String source, String debug) {
            String javaSource = source;
            if (debug != null) {
                System.err.println("m2e SMAP merge is not supported!");
                System.err.println(debug);
            } else {
                StringBuilder smap = new StringBuilder();
                smap.append("SMAP\n");
                smap.append(javaSource).append("\n");
                smap.append("Java\n"); // default strata name
                smap.append("*S m2e\n");
                smap.append("*F\n");
                smap.append("1 ").append(source).append("\n");
                smap.append("2 ").append(location).append("\n");
                // JSR-045, StratumSection
                // "One FileSection and one LineSection (in either order) must follow the StratumSection"
                smap.append("*L\n");
                smap.append("*E\n");
                debug = smap.toString();
            }/*from  w  w w  .  ja va2s  .  com*/

            super.visitSource(javaSource, debug);
        };

    }, 0);

    return w.toByteArray();
}

From source file:com.liferay.portal.osgi.web.servlet.jsp.compiler.test.JspPrecompileTest.java

License:Open Source License

@Test
public void testPrecompiledJsp() throws Exception {
    String packagePathString = _JSP_PACKAGE_NAME.replace(CharPool.PERIOD, CharPool.SLASH);

    Path packagePath = _workDirPath.resolve(packagePathString);

    Files.createDirectories(packagePath);

    String jspClassName = _PRECOMPILE_JSP_FILE_NAME.replace(CharPool.PERIOD, CharPool.UNDERLINE);

    Path jspClassPath = packagePath.resolve(jspClassName.concat(".class"));

    final String className = packagePathString.concat(jspClassName);

    try (InputStream inputStream = PrecompileTestServlet.class
            .getResourceAsStream(PrecompileTestServlet.class.getSimpleName() + ".class");
            OutputStream outputStream = Files.newOutputStream(jspClassPath)) {

        ClassReader classReader = new ClassReader(inputStream);

        ClassWriter classWriter = new ClassWriter(classReader, 0);

        ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) {

            @Override//from   ww  w.j  a v  a  2 s .c o m
            public void visit(int version, int access, String name, String signature, String superName,
                    String[] interfaces) {

                super.visit(version, access, className, signature, superName, interfaces);
            }

        };

        classReader.accept(classVisitor, 0);

        outputStream.write(classWriter.toByteArray());
    }

    try (CaptureAppender captureAppender = Log4JLoggerTestUtil.configureLog4JLogger(_JSP_COMPILER_CLASS_NAME,
            Level.DEBUG)) {

        _invokeJSP(_PRECOMPILE_JSP_FILE_NAME, "Precompiled");

        Assert.assertFalse("JSP was compiled at runtime",
                _containsCompilerLog(captureAppender, _PRECOMPILE_JSP_FILE_NAME));
    } finally {
        Files.delete(jspClassPath);
    }
}

From source file:com.liferay.portal.upgrade.test.BaseBuildAutoUpgradeTestCase.java

License:Open Source License

protected void addClass(String path, JarOutputStream jarOutputStream, Object[][] tableColumns, String createSQL)
        throws IOException {

    jarOutputStream.putNextEntry(new JarEntry(path));

    ClassLoader classLoader = BaseBuildAutoUpgradeTestCase.class.getClassLoader();

    try (InputStream inputStream = classLoader.getResourceAsStream(ENTITY_PATH)) {

        ClassReader classReader = new ClassReader(inputStream);

        ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);

        ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) {

            @Override//from  w ww. jav  a 2s  .  c  o m
            public FieldVisitor visitField(int access, String name, String desc, String signature,
                    Object value) {

                if ((createSQL != null) && name.equals("TABLE_SQL_CREATE")) {

                    value = createSQL;
                }

                return super.visitField(access, name, desc, signature, value);
            }

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

                MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);

                if (name.equals("<clinit>")) {
                    _initTableColumns(methodVisitor, tableColumns);

                    return null;
                }

                return methodVisitor;
            }

        };

        classReader.accept(classVisitor, 0);

        jarOutputStream.write(classWriter.toByteArray());
    }

    jarOutputStream.closeEntry();
}

From source file:com.lodgon.parboiled.transform.AsmTestUtils.java

License:Apache License

public static String getClassDump(byte[] code) {
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);
    TraceClassVisitor traceClassVisitor = new TraceClassVisitor(printWriter);
    ClassVisitor checkClassAdapter = new ClassVisitor(Opcodes.ASM4, traceClassVisitor) {
    };//from ww  w. j  av  a2  s . co m
    //ClassAdapter checkClassAdapter = new CheckClassAdapter(traceClassVisitor);
    ClassReader classReader;
    classReader = new ClassReader(code);
    classReader.accept(checkClassAdapter, 0);
    printWriter.flush();
    return stringWriter.toString();
}

From source file:com.mgmtp.perfload.agent.Transformer.java

License:Apache License

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

    final String classNameWithDots = className.replace('/', '.');
    EntryPoints entryPoints = config.getEntryPoints();

    final Map<String, MethodInstrumentations> methodsConfig = config.getInstrumentations()
            .get(classNameWithDots);//w  w  w  .j  a v  a  2 s  .co m
    final boolean isFilter = entryPoints.hasFilter(classNameWithDots);
    final boolean isServlet = entryPoints.hasServlet(classNameWithDots);

    if (methodsConfig == null && !isFilter && !isServlet) {
        // no instrumentation configured for this class
        // return null, so no transformation is done
        return null;
    }

    logger.writeln("Transforming class: " + classNameWithDots);

    // flag for storing if at least one hook is weaved in
    final MutableBoolean weaveFlag = new MutableBoolean();

    ClassReader cr = new ClassReader(classfileBuffer);
    ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
    ClassVisitor cv = new ClassVisitor(Opcodes.ASM4, cw) {
        @Override
        public MethodVisitor visitMethod(final int access, final String name, final String desc,
                final String signature, final String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
            if (mv != null) {
                if (isFilter && "doFilter".equals(name)
                        || isServlet && "service".equals(name) && SERVLET_SERVICE_DESC.equals(desc)) {
                    mv = createServletApiHookVisitor(access, name, desc, mv);
                }
                if (methodsConfig != null) {
                    MethodInstrumentations methodInstrumentations = methodsConfig.get(name);
                    if (methodInstrumentations != null) {
                        mv = createMeasuringHookVisitor(access, name, desc, mv, methodInstrumentations);
                    }
                }
            }
            return mv;
        }

        private MethodVisitor createMeasuringHookVisitor(final int access, final String methodName,
                final String desc, final MethodVisitor mv,
                final MethodInstrumentations methodInstrumentations) {
            boolean weave = false;
            if (methodInstrumentations.isEmpty()) {
                // no params configured, so we just weave the hook into any method with this name
                weave = true;
            } else {
                // weave if params match
                for (List<String> paramClassNames : methodInstrumentations) {
                    Type[] argumentTypes = Type.getArgumentTypes(desc);
                    List<String> classNames = newArrayListWithCapacity(argumentTypes.length);
                    for (Type argumentType : argumentTypes) {
                        classNames.add(argumentType.getClassName());
                    }
                    if (classNames.equals(paramClassNames)) {
                        weave = true;
                        break;
                    }
                }
            }
            if (weave) {
                logger.writeln("Instrumenting method: " + classNameWithDots + "." + methodName);
                weaveFlag.setValue(true);
                return new MeasuringHookMethodVisitor(access, classNameWithDots, methodName, desc, mv);
            }
            return mv;
        }

        private MethodVisitor createServletApiHookVisitor(final int access, final String methodName,
                final String desc, final MethodVisitor mv) {
            logger.writeln("Adding servlet api hook: " + classNameWithDots + "." + methodName);
            weaveFlag.setValue(true);
            return new ServletApiHookMethodVisitor(access, methodName, desc, mv);
        }
    };

    // accept the visitor in order to perform weaving
    cr.accept(cv, ClassReader.EXPAND_FRAMES);

    if (weaveFlag.isTrue()) {
        byte[] transformedclassBytes = cw.toByteArray();
        dumpTransformedClassFile(className, transformedclassBytes);
        return transformedclassBytes;
    }

    // no transformation
    return null;
}