您的位置:首页 > 编程语言 > Java开发

Javassist简单应用 - 不用学习JVM知识也可以修改class文件

2012-12-09 19:58 295 查看
------------------------------------------------

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();

}

...

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: