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