why the field can't be printed and so many redundancy
lucefe <[email protected]>
| Newsgroups | gmane.comp.java.objectweb.asm |
|---|---|
| Message-ID | <[email protected]> |
*Hi, everybody,
I want to instrument a method:*
* from*
public void m() throws Exception{
Thread.sleep(100);
}
*to*
public void m() throws Exception{
timer -= System.currentTimeMillis();
Thread.sleep(100);
timer += System.currentTimeMillis();
System.out.println(timer);
}
*my classAdapter is attached, when I use the next code:*
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintWriter printWriter = new PrintWriter(stream);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
TraceClassVisitor tcv = new TraceClassVisitor(cw,
printWriter);
AddTimerAdapter ca = new AddTimerAdapter(tcv);
AddTimerMethodAdapter ma =
ca.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V", null, null);
ma.visitCode();
ma.visitInsn(Opcodes.RETURN);
ma.visitMaxs(4, 1);
ma.visitEnd();
ca.visitEnd();
cr.accept(ca, ClassReader.SKIP_DEBUG);
System.out.println(stream);
*I got the following result. There were so many redundancy, and the field
timer was not printed as I wanted. who can tell me where is my error.*
// class version 49.0 (49)
// access flags 33
public class pkg/C {
// access flags 9
public static J timer
// access flags 1
public <init>()V
// access flags 1
public m()V throws java/lang/Exception
GETSTATIC pkg/C.timer : J
INVOKESTATIC java/lang/System.currentTimeMillis ()J
LSUB
PUTSTATIC pkg/C.timer : J
GETSTATIC pkg/C.timer : J
INVOKESTATIC java/lang/System.currentTimeMillis ()J
LSUB
PUTSTATIC pkg/C.timer : J
LDC 100
INVOKESTATIC java/lang/Thread.sleep (J)V
GETSTATIC pkg/C.timer : J
INVOKESTATIC java/lang/System.currentTimeMillis ()J
LADD
PUTSTATIC pkg/C.timer : J
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
GETSTATIC pkg/C.timer : J
INVOKEVIRTUAL java/io/PrintStream.println (J)V
GETSTATIC pkg/C.timer : J
INVOKESTATIC java/lang/System.currentTimeMillis ()J
LADD
PUTSTATIC pkg/C.timer : J
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
GETSTATIC pkg/C.timer : J
INVOKEVIRTUAL java/io/PrintStream.println (J)V
RETURN
MAXSTACK = 8
MAXLOCALS = 1
// access flags 9
public static J timer
}
AddTimerAdapter.java
(text/x-java, 3.1 KB)
package ch3;
import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ACC_STATIC;
import static org.objectweb.asm.Opcodes.ATHROW;
import static org.objectweb.asm.Opcodes.GETSTATIC;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.IRETURN;
import static org.objectweb.asm.Opcodes.LADD;
import static org.objectweb.asm.Opcodes.LSUB;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
import static org.objectweb.asm.Opcodes.RETURN;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
/**
* ASM Guide example class.
*
* @author Eric Bruneton
*/
public class AddTimerAdapter extends ClassAdapter {
private String owner;
private boolean isInterface;
public AddTimerAdapter(ClassVisitor cv) {
super(cv);
}
public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
cv.visit(version, access, name, signature, superName, interfaces);
owner = name;
isInterface = (access & ACC_INTERFACE) != 0;
}
public AddTimerMethodAdapter visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
exceptions);
AddTimerMethodAdapter ma;
if (!isInterface && mv != null && !name.equals("<init>")) {
ma = new AddTimerMethodAdapter(mv);
return ma;
}
return null;
}
public void visitEnd() {
if (!isInterface) {
FieldVisitor fv = cv.visitField(ACC_PUBLIC + ACC_STATIC, "timer",
"J", null, null);
if (fv != null) {
fv.visitEnd();
}
}
cv.visitEnd();
}
public class AddTimerMethodAdapter extends MethodAdapter {
public AddTimerMethodAdapter(MethodVisitor mv) {
super(mv);
}
public void visitCode() {
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
mv.visitMethodInsn(INVOKESTATIC, "java/lang/System",
"currentTimeMillis", "()J");
mv.visitInsn(LSUB);
mv.visitFieldInsn(PUTSTATIC, owner, "timer", "J");
}
public void visitInsn(int opcode) {
if ((opcode == IRETURN || opcode == RETURN) || opcode == ATHROW) {
mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
mv.visitMethodInsn(INVOKESTATIC, "java/lang/System",
"currentTimeMillis", "()J");
mv.visitInsn(LADD);
mv.visitFieldInsn(PUTSTATIC, owner, "timer", "J");
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitFieldInsn(GETSTATIC, owner, "timer", "J");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V");
}
mv.visitInsn(opcode);
}
public void visitMaxs(int maxStack, int maxLocals) {
mv.visitMaxs(maxStack + 4, maxLocals);
}
}
}
message-footer.txt
(text/plain, 238 B)
-- You receive this message as a subscriber of the [email protected] mailing list. To unsubscribe: mailto:[email protected] For general help: mailto:[email protected]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws