------------------------------------------------
package rocks;
import javassist.*;
public class TestAssist {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.sun.kvem.environment.EmulatorWrapper");
CtMethod m = cc.getDeclaredMethod("main");
m.insertBefore("{ "
+ "java.io.File f = new java.io.File(\"log.txt\"); "
+ "java.io.OutputStream os = new java.io.FileOutputStream(f); "
+ "java.io.PrintStream out = new java.io.PrintStream(os); "
+ "out.println(java.util.Arrays.asList($1)); "
+ "out.close(); "
+ "}");
cc.writeFile();
}
}
----------------------------------------------------
编译
javac -cp c:\apps\javassist-3.7\javassist.jar;bin -d bin src\rocks\*.java
运行,也就是对class进行修改
java -cp c:\apps\javassist-3.7\javassist.jar;bin rocks.TestAssist
屏蔽重定向代码:
------------------------------------------------------
package rocks;
import javassist.*;
import javassist.expr.*;
public class TestAssist {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(args[0]); // "com.sun.kvem.environment.EmulatorWrapper$UIExecutor"
CtMethod m = cc.getDeclaredMethod(args[1]); //"runInGUI"
m.instrument(new ExprEditor() {
public void edit(MethodCall m) throws CannotCompileException {
String clzname = m.getClassName();
String mtdname = m.getMethodName();
if ("java.lang.System".equals(clzname) && "setOut".equals(mtdname)) {
//m.replace("{ $1 = System.out; $proceed($$); }");
m.replace("{ }");
}
if ("java.lang.System".equals(clzname) && "setErr".equals(mtdname)) {
//m.replace("{ $1 = System.err; $proceed($$); }");
m.replace("{ }");
}
//System.out.println(m.getClassName() + "." + m.getMethodName() + ":" + m.getLineNumber());
}
});
cc.writeFile();
}
...
}