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

来源:互联网 发布:智阅pdf阅读器 源码 编辑:程序博客网 时间:2024/06/02 07:52

 

------------------------------------------------ 

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

}

原创粉丝点击