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();
}
...
}
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();
}
...
}
相关文章推荐
- phpwind代码分析之global.php简单说明(主要学习php基础知识的应用)
- Anko - 让你可以更简单地用 Kotlin 开发 Android 应用
- 用jrebel实现 jvm热部署,修改类不用重启tomcat
- linux——学习篇(三)之makefile的简单应用及实现简单的进度条
- JPA 简单应用 学习 .
- 安卓学习之样式的简单应用
- WEBX3学习-1分钟构建WEBX简单应用
- 对最近学习的知识整理(回调函数和简单的设计思路)
- 修改Vista盘符 不用任何工具也可以搞定
- 黑马程序员_HTML学习知识简单总结
- 关于Oracle的一些学习简单知识
- Android模拟内存紧张,应用被杀死如何模拟应用程序被杀掉? 更新:Daniel Lew指出,最简单的方法是在DDMS中点击”Stop Porcess”杀掉你的程序,在你调试程序的时候可以这样做。
- 学习总结 HTML简单应用
- 学习Python数据分析随手笔记【一】numpy数组的函数简单应用
- Android MediaPlayer 简单综合应用------列出sdcard里所有.mp3文件,并且可以点击播放!
- [C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配
- 高德地图的Js API 简单Demo,可以快速实现路点描线(摘自官方接口及自行修改测试)
- 黑马程序员_Dom学习知识简单总结
- 不用MFC也可以查内存泄露,简单好用。
- 学习ASP.NET需求的基本的c#知识(转帖+已修改)