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

 

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

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值