List of usage examples for org.objectweb.asm ClassWriter toByteArray
public byte[] toByteArray()
From source file:ModuleInfoGenerator.java
License:Open Source License
public static void main(String[] args) throws Exception { File dest = new File(args[0]); ClassWriter cw = new ClassWriter(0); cw.visit(V9, Opcodes.ACC_MODULE, "module-info", null, null, null); ModuleVisitor mv = cw.visitModule("org.joml", 0, args[1]); mv.visitRequire("java.base", ACC_MANDATED, "9"); mv.visitRequire("jdk.unsupported", ACC_STATIC_PHASE, null); mv.visitExport("org/joml", 0, (String[]) null); mv.visitExport("org/joml/sampling", 0, (String[]) null); mv.visitEnd();//from w w w . j a v a2s .c o m cw.visitEnd(); FileOutputStream fos = new FileOutputStream(new File(dest, "module-info.class")); fos.write(cw.toByteArray()); fos.close(); }
From source file:Test1.java
License:Apache License
private static void implementInterface(ClassNode cn) throws Exception { // MethodNode fromMethod = new MethodNode(ACC_PUBLIC, "fromData", // "(Ljava/io/DataInput;)V", null, new String[] { // "java/io/IOException", // "java/lang/ClassNotFoundException" }); // mv = cw.visitMethod(ACC_PUBLIC, "toData", "(Ljava/io/DataOutput;)V", // null, new String[] { "java/io/IOException" }); MethodNode toMethod = new MethodNode(ACC_PUBLIC, "toData", "(Ljava/io/DataOutput;)V", null, new String[] { "java/io/IOException" }); InsnList instToMethod = toMethod.instructions; for (int i = 0; i < cn.fields.size(); i++) { FieldNode fn = (FieldNode) cn.fields.get(i); toMethod(cn.name, fn, instToMethod); }/*from ww w .jav a2 s. c o m*/ instToMethod.add(new InsnNode(RETURN)); cn.methods.add(toMethod); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cn.accept(cw); byte[] bt = cw.toByteArray(); ClassReader cr = new ClassReader(bt); CheckClassAdapter ca = new CheckClassAdapter(cw); FileOutputStream fo = new FileOutputStream("d:/x1.log"); PrintWriter pw = new PrintWriter(fo); ca.verify(cr, true, pw); ByteArrayClassLoader bacl = new ByteArrayClassLoader(bt); Class cls = bacl.loadClass("ynd.test.Ac01"); DataSerializable di = (DataSerializable) cls.newInstance(); di.toData(null); }
From source file:Java6to2.java
License:Open Source License
private static byte[] transform(InputStream classfile) throws IOException { ClassReader cr = new ClassReader(classfile); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new ClassVisitor(ASM7, cw) { String internalName;/* www .ja va 2s. co m*/ boolean classLookupMethodGenerated; Set fieldsGenerated = new HashSet(); public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { /* Change class file version to 1.2 */ cv.visit(V1_2, access, name, signature, superName, interfaces); this.internalName = name; } /** * Generates the synthetic "class$" method, used to lookup classes via Class.forName(). This uses the exact same code as does JDK8 javac for target 1.2. */ void generateSyntheticClassLookupMethod() { MethodVisitor mv = cv.visitMethod(ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, "class$", "(Ljava/lang/String;)Ljava/lang/Class;", null, null); { Label start = new Label(); Label end = new Label(); Label handler = new Label(); mv.visitTryCatchBlock(start, end, handler, "java/lang/ClassNotFoundException"); mv.visitLabel(start); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;", false); mv.visitLabel(end); mv.visitInsn(ARETURN); mv.visitLabel(handler); mv.visitVarInsn(ASTORE, 1); mv.visitTypeInsn(NEW, "java/lang/NoClassDefFoundError"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NoClassDefFoundError", "<init>", "()V", false); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoClassDefFoundError", "initCause", "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", false); mv.visitInsn(ATHROW); } mv.visitMaxs(2, 2); mv.visitEnd(); } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); final ClassVisitor cv = this.cv; return new MethodVisitor(ASM7, mv) { /** * Intercepts class instantiations to see whether they instantiate a StringBuilder. Those instructions were generated by javac for string concatenations. But * StringBuilder is not available on JRE1.2, so we just replace it with StringBuffer. */ public void visitTypeInsn(int opcode, String type) { if (opcode == NEW && "java/lang/StringBuilder".equals(type)) { mv.visitTypeInsn(opcode, "java/lang/StringBuffer"); } else { mv.visitTypeInsn(opcode, type); } } /** * Intercepts method invocations to see whether they do something with StringBuilder. Those instructions were generated by javac for string concatenations. But * StringBuilder is not available on JRE1.2, so we just replace it with StringBuffer. */ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { if ("java/lang/StringBuilder".equals(owner)) { mv.visitMethodInsn(opcode, "java/lang/StringBuffer", name, desc.replace("java/lang/StringBuilder", "java/lang/StringBuffer"), itf); } else { mv.visitMethodInsn(opcode, owner, name, desc, itf); } } /** * Intercepts LDC instructions and check whether they are used to load a class. This is not supported on Java 1.2, so we convert it to the same code used by the * JDK8 javac: * <ul> * <li>create synthetic fields holding the resolved class objects * <li>create a synthetic method called "class$" which does Class.forName * </ul> */ public void visitLdcInsn(Object cst) { if (cst instanceof Type) { Type t = (Type) cst; String syntheticField = "class$" + t.getInternalName().replace('/', '$').replace("[", ""); if (!classLookupMethodGenerated) { /* Emit the synthetic "class$" method, used to lookup classes via Class.forName() */ generateSyntheticClassLookupMethod(); classLookupMethodGenerated = true; } if (!fieldsGenerated.contains(syntheticField)) { /* Generate a synthetic field holding the resolved Class object */ cv.visitField(ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, syntheticField, "Ljava/lang/Class;", null, null); fieldsGenerated.add(syntheticField); } mv.visitFieldInsn(GETSTATIC, internalName, syntheticField, "Ljava/lang/Class;"); Label nonNull = new Label(); mv.visitJumpInsn(IFNONNULL, nonNull); mv.visitLdcInsn(t.getInternalName().replace('/', '.')); mv.visitMethodInsn(INVOKESTATIC, internalName, "class$", "(Ljava/lang/String;)Ljava/lang/Class;", false); mv.visitInsn(DUP); mv.visitFieldInsn(PUTSTATIC, internalName, syntheticField, "Ljava/lang/Class;"); Label cnt = new Label(); mv.visitJumpInsn(GOTO, cnt); mv.visitLabel(nonNull); mv.visitFieldInsn(GETSTATIC, internalName, syntheticField, "Ljava/lang/Class;"); mv.visitLabel(cnt); } else { mv.visitLdcInsn(cst); } } }; } }; cr.accept(cv, ClassReader.SKIP_FRAMES); // <- Frames are not used in Java 1.2, so skip them return cw.toByteArray(); }
From source file:Asm.java
License:Apache License
private static void modify(String clazz) throws Exception { ClassNode classNode = new ClassNode(); ClassReader cr = new ClassReader(clazz); cr.accept(classNode, 0);//from ww w. j a va2 s .co m modify(classNode); ClassWriter cw = new ClassWriter(0); classNode.accept(cw); byte[] b = cw.toByteArray(); OutputStream out = new FileOutputStream(clazz + ".out"); out.write(b, 0, b.length); out.close(); }
From source file:allout58.mods.techtree.asm.TechTreeModClassTransformer.java
License:Open Source License
private byte[] apply(byte[] bytes, String name, int id) { Preconditions.checkNotNull(bytes);//from w w w .j a va 2 s . c o m ClassReader reader = new ClassReader(bytes); ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); ClassVisitor visitor = null; switch (id) { case 0: visitor = new CraftingContainerVisitor(name, writer); break; case 1: visitor = new CraftingPlayerVisitor(name, writer); break; } try { if (visitor != null) reader.accept(visitor, 0); return writer.toByteArray(); } catch (Exception e) { FMLRelaunchLog.severe("Error transforming %s: %s", name, e); return bytes; } }
From source file:analysis.RuntimeTemplateGenerator.java
License:Open Source License
public JarClasses generateTemplate() { ClassReader classReader;//from w ww .j av a 2 s . com ClassVisitor classVisitor; ClassWriter classWriter; Map<String, JarClasses.Entry> entries = new HashMap<String, JarClasses.Entry>(); for (ClassReference ref : references) { classReader = classes.get(ref.getName()); classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classVisitor = getClassTransformer(ref, classWriter); classReader.accept(classVisitor, ClassReader.SKIP_FRAMES); entries.put(ref.getName(), new JarClasses.Entry(classWriter.toByteArray(), ref.getName())); } return new JarClasses(entries); }
From source file:apb.processors.NotNullInstrumentTask.java
License:Apache License
private void instrumentClass(@NotNull final String classPath) { final File classFile = new File(classPath); if (classFile.getName().endsWith(".class")) { try {/*from w w w . ja v a2s . co m*/ final InputStream fis = new FileInputStream(classFile); try { final ClassReader reader = new ClassReader(fis); final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); final NotNullClassInstrumenter classInstrumenter = new NotNullClassInstrumenter(writer); reader.accept(classInstrumenter, 0); if (classInstrumenter.isModified()) { logVerbose("Adding @NotNull assertions to " + classPath + "\n"); final OutputStream os = new FileOutputStream(classPath); try { os.write(writer.toByteArray()); } finally { os.close(); } } } finally { fis.close(); } } catch (IOException e) { logVerbose( "Failed to instrument @NotNull assertion for " + classPath + ": " + e.getMessage() + "\n"); e.printStackTrace(); } } }
From source file:appeng.core.api.ApiPart.java
License:Open Source License
public Class getClassByDesc(String addendum, String fullPath, String root, String next) { if (this.roots.get(fullPath) != null) { return this.roots.get(fullPath); }/*w ww . j a v a 2 s . co m*/ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassNode n = this.getReader(next); String originalName = n.name; try { n.name = n.name + '_' + addendum; n.superName = Class.forName(root).getName().replace(".", "/"); } catch (Throwable t) { AELog.error(t); } for (MethodNode mn : n.methods) { Iterator<AbstractInsnNode> i = mn.instructions.iterator(); while (i.hasNext()) { this.processNode(i.next(), n.superName); } } DefaultPackageClassNameRemapper remapper = new DefaultPackageClassNameRemapper(); remapper.inputOutput.put("appeng/api/parts/LayerBase", n.superName); remapper.inputOutput.put(originalName, n.name); n.accept(new RemappingClassAdapter(cw, remapper)); // n.accept( cw ); // n.accept( new TraceClassVisitor( new PrintWriter( System.out ) ) ); byte[] byteArray = cw.toByteArray(); int size = byteArray.length; Class clazz = this.loadClass(n.name.replace("/", "."), byteArray); try { Object fish = clazz.newInstance(); Class rootC = Class.forName(root); boolean hasError = false; if (!rootC.isInstance(fish)) { hasError = true; AELog.severe("Error, Expected layer to implement " + root + " did not."); } if (fish instanceof LayerBase) { hasError = true; AELog.severe("Error, Expected layer to NOT implement LayerBase but it DID."); } if (!fullPath.contains(".fmp.")) { if (!(fish instanceof TileCableBus)) { hasError = true; AELog.severe("Error, Expected layer to implement TileCableBus did not."); } if (!(fish instanceof TileEntity)) { hasError = true; AELog.severe("Error, Expected layer to implement TileEntity did not."); } } if (!hasError) { AELog.info("Layer: " + n.name + " loaded successfully - " + size + " bytes"); } } catch (Throwable t) { AELog.severe("Layer: " + n.name + " Failed."); AELog.error(t); } this.roots.put(fullPath, clazz); return clazz; }
From source file:appeng.coremod.asm.ASMIntegration.java
License:Open Source License
@Nullable @Override/* ww w . ja v a 2s . c o m*/ public byte[] transform(final String name, final String transformedName, final byte[] basicClass) { if (basicClass == null || transformedName.startsWith("appeng.coremod")) { return basicClass; } if (transformedName.startsWith("appeng.")) { final ClassNode classNode = new ClassNode(); final ClassReader classReader = new ClassReader(basicClass); classReader.accept(classNode, 0); try { final boolean reWrite = this.removeOptionals(classNode); if (reWrite) { final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(writer); return writer.toByteArray(); } } catch (final Throwable t) { t.printStackTrace(); } } return basicClass; }
From source file:appeng.coremod.transformer.IntegrationTransformer.java
License:Open Source License
@Nullable @Override// w w w . j a v a2s .c o m public byte[] transform(final String name, final String transformedName, final byte[] basicClass) { if (basicClass == null) { return basicClass; } if (transformedName.startsWith("appeng.")) { final ClassNode classNode = new ClassNode(); final ClassReader classReader = new ClassReader(basicClass); classReader.accept(classNode, 0); try { final boolean reWrite = this.removeOptionals(classNode); if (reWrite) { final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(writer); return writer.toByteArray(); } } catch (final Throwable t) { t.printStackTrace(); } } return basicClass; }