/** * Constructs a new {@link GaTraceClassVisitor}. * * @param pw the print writer to be used to print the class. */ public GaTraceClassVisitor(final PrintWriter pw) { super(Opcodes.ASM5, null); this.pw = pw; this.p = new Textifier(); }
@Override public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { Printer p = this.p.visitMethod(access, name, desc, signature, exceptions); MethodVisitor mv = cv == null ? null : cv.visitMethod(access, name, desc, signature, exceptions); return new TraceMethodVisitor(mv, p); }
@Override public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) { Printer p = this.p.visitClassAnnotation(desc, visible); AnnotationVisitor av = cv == null ? null : cv.visitAnnotation(desc, visible); return new TraceAnnotationVisitor(av, p); }
public void toWriter(Writer writer, int flags){ PrintWriter printWriter = new PrintWriter(writer); TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printWriter); classReader.accept(traceClassVisitor, flags); }
@Override public String toString() { Printer printer = new ASMifier(); TraceMethodVisitor visitor = new TraceMethodVisitor(printer); node.accept(visitor); return printer.getText().toString(); }
@Override public void visitEnd() { p.visitClassEnd(); if (pw != null) { p.print(pw); pw.flush(); } super.visitEnd(); }
protected void checkTrace(String expected) throws IOException { org.objectweb.asm.ClassReader cr = new org.objectweb.asm.ClassReader(traceCode); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); CheckClassAdapter.verify(cr, false, pw); if (sw.toString().contains("AnalyzerException")) { System.err.println(sw.toString()); fail(); } }
public class Copy { private Keyboard keyboard = new Keyboard(); // concrete dependency private Printer printer = new Printer(); // concrete dependency public void copy() { for (int c = keyboard.read(); c != KeyBoard.EOF) { printer.print(c); } } } Now with dependency inversion: public class Copy { private Reader reader; // any dependency satisfying the reader interface will work private Writer writer; // any dependency satisfying the writer interface will work public void copy() { for (int c = reader.read(); c != Reader.EOF) { writer.write(c); } } public Copy(Reader reader, Writer writer) { this.reader = reader; this.writer = writer; } }
public static void main(String args[]){ Printer printer = new HP(); printer.getSystemResource(); printer.print(); }
@Override public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) { Printer p = this.p.visitField(access, name, desc, signature, value); FieldVisitor fv = cv == null ? null : cv.visitField(access, name, desc, signature, value); return new TraceFieldVisitor(fv, p); }
@Override public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { Printer p = this.p.visitClassTypeAnnotation(typeRef, typePath, desc, visible); AnnotationVisitor av = cv == null ? null : cv.visitTypeAnnotation( typeRef, typePath, desc, visible); return new TraceAnnotationVisitor(av, p); }
@Override public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) { p.visit(version, access, name, signature, superName, interfaces); super.visit(version, access, name, signature, superName, interfaces); }
@Override public void visitAttribute(final Attribute attr) { p.visitClassAttribute(attr); super.visitAttribute(attr); }
@Override public void visitInnerClass(final String name, final String outerName, final String innerName, final int access) { p.visitInnerClass(name, outerName, innerName, access); super.visitInnerClass(name, outerName, innerName, access); }
@Override public void visitSource(final String file, final String debug) { p.visitSource(file, debug); super.visitSource(file, debug); }
@Override public void visitOuterClass(final String owner, final String name, final String desc) { p.visitOuterClass(owner, name, desc); super.visitOuterClass(owner, name, desc); }
public static void main(String[] args) throws Exception { ASMifier.main(new String[]{"target/classes/groovy/swing/SwingBuilder.class"}); // ASMifierClassVisitor.main(new String[]{"target/classes/org/codehaus/groovy/tools/shell/util/HelpFormatter.class"}); // ASMifierClassVisitor.main(new String[]{"target/classes/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.class"}); // ASMifierClassVisitor.main(new String[]{"target/test-classes/spectralnorm.class"}); // ASMifierClassVisitor.main(new String[]{"target/test-classes/groovy/bugs/CustomMetaClassTest.class"}); } }
private static void printClassBytes(byte[] byteCode) { if (DEBUG) { TraceClassVisitor visitor = new TraceClassVisitor(new PrintWriter(System.out)); new ClassReader(byteCode).accept(visitor, 0); } }
/** * Outputs the bytecode generated as a textual representation * * @param pw * The PrintWriter the textual representation is written to */ public void generateTextualRepresentation(PrintWriter pw) { cv = new TraceClassVisitor(pw); generateByteCode(); }
protected String asmify(byte[] bytecode) { if (bytecode == null) { return ""; } StringWriter sw = new StringWriter(); TraceClassVisitor acv = new TraceClassVisitor(new PrintWriter(sw)); new org.objectweb.asm.ClassReader(bytecode).accept(acv, 0); return sw.toString(); }