Hi
It is fairly easy.. Suppose I've a static method in the class
Public MyClass {
public static void methodReturnEvent(String className, String
methodName ){
System.out.println("Method returned : " + className +
"::" + methodName ) ;
}
}
In my byte instrumentation code I would do the following
JavaClass clazz = ... my class in wrapped in the JavaClass
ConstantPoolGen cpGen = new
ConstantPoolGen(clazz.getConstantPool() );
// add a reference the to static method in the constantpool
int methodReturn =
cpGen.addMethodRef("MyClass","methodReturnEvent",
"(Ljava/lang/String;Ljava/lang/String;)V");
Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
// iterate thru all the methods and instrument
them
methods[i] = instrumentReturn(methods[i], cpGen)
;
}
public Method instrumentReturn(Javaclass clazz, Method m,
ConstantPoolGen cpGen, int methodReturn) {
MethodGen mg = new MethodGen(m, clazz.getClassName(),
cpGen);
// get the instruction list
InstructionList il = mg.getInstructionList();
InstructionHandle[] ihs = il.getInstructionHandles();
String methodName = mg.getName()
for (int j = 0; j < ihs.length; j++) {
// check if the instruction is a return instruction
if (ihs[j].getInstruction() instanceof ReturnInstruction) {
// create instruction set to invoke static
method
InstructionList endPoint = new
InstructionList();
endPoint.append(new PUSH(cpGen,
clazz.getClassName()));
endPoint.append(new PUSH(cpGen, methodName));
endPoint.append(new INVOKESTATIC(methodReturn));
// insert it before the return instruction
InstructionHandle ih = il.insert(ihs[j], endPoint);
il.redirectBranches(ihs[j], ih);
}
}
mg.setMaxStack();
return mg.getMethod() ;
}
-----Original Message-----
From: Irving, Dave [mailto:[EMAIL PROTECTED]
Sent: Thursday, August 19, 2004 11:28 AM
To: '[EMAIL PROTECTED]'
Subject: RE: Before Return
Hmmm.... In fact, what I think I'd really like to do is get a try /
finally
around a whole method call.
I know that 'finally' doesn't exist at the byte code level - so I think
I've
still got the problem of inserting instructions before each return (JSRs
I
guess...).
I've had some experience with BCEL - I managed to get a mock object
generator implemented using it (still haven't got round to making it
open
source....) - but I've never had to insert instructions before like
this.
Any pointers would be really appreciated!
-----Original Message-----
From: Irving, Dave
Sent: Thursday, August 19, 2004 3:28 PM
To: [EMAIL PROTECTED]
Subject: Before Return
Hi,
I want to make a call to a static method before each return of a method
of
an existing class - at the moment Im not too fussed about dealing with
exceptions.
I can find the return instructions easy enough and insert my
instructions -
but what Im not sure about is how to "re-setup" everything for the
return
that follows.
Has anyone done this before and have any pointers?
Many thanks,
Dave
This e-mail and any attachment is for authorised use by the intended
recipient(s) only. It may contain proprietary material, confidential
information and/or be subject to legal privilege. It should not be
copied, disclosed to, retained or used by, any other party. If you are
not an intended recipient then please promptly delete this e-mail and
any attachment and all copies and inform the sender. Thank you.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]