The following code example tell you how to use the alias_method, to add a logging logic to the exit() method.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Mod | |
alias_method :orig_exit, :exit | |
def exit(code=0) | |
puts "Exiting with code #{code}" | |
orig_exit(code) | |
end | |
end | |
include Mod | |
exit(99) |
the code example:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private static void addTiming(CtClass clas, String mname) | |
throws NotFoundException, CannotCompileException { | |
// get the method information (throws exception if method with | |
// given name is not declared directly by this class, returns | |
// arbitrary choice if more than one with the given name) | |
CtMethod mold = clas.getDeclaredMethod(mname); | |
// rename old method to synthetic name, then duplicate the | |
// method with original name for use as interceptor | |
String nname = mname+"$impl"; | |
mold.setName(nname); | |
CtMethod mnew = CtNewMethod.copy(mold, mname, clas, null); | |
// start the body text generation by saving the start time | |
// to a local variable, then call the timed method; the | |
// actual code generated needs to depend on whether the | |
// timed method returns a value | |
String type = mold.getReturnType().getName(); | |
StringBuffer body = new StringBuffer(); | |
body.append("{\nlong start = System.currentTimeMillis();\n"); | |
if (!"void".equals(type)) { | |
body.append(type + " result = "); | |
} | |
body.append(nname + "($$);\n"); | |
// finish body text generation with call to print the timing | |
// information, and return saved value (if not void) | |
body.append("System.out.println(\"Call to method " + mname + | |
" took \" +\n (System.currentTimeMillis()-start) + " + | |
"\" ms.\");\n"); | |
if (!"void".equals(type)) { | |
body.append("return result;\n"); | |
} | |
body.append("}"); | |
// replace the body of the interceptor method with generated | |
// code block and add it to class | |
mnew.setBody(body.toString()); | |
clas.addMethod(mnew); | |
// print the generated code block just to show what was done | |
System.out.println("Interceptor method body:"); | |
System.out.println(body.toString()); | |
} |
Resource
1. alias_method API document
2. IBM Javaassist tutorial
3. Spring AOP document