【Soot学习记录1】新Class文件的生成及错误处理
2015-09-22 09:49
666 查看
在刚开始,我们总是发现生成的class文件无法正常使用,运行时会报错,这其中的一个原因就是未在class文件中添加构造函数。
完成SootClass的内容
将SootClass添加至Scene中
使用PackManager.v().writeClass(sootClass)来完成class文件的生成
生成流程
新建SootClass实例完成SootClass的内容
将SootClass添加至Scene中
使用PackManager.v().writeClass(sootClass)来完成class文件的生成
问题解决
由于平时写Java代码时,编译器会自动为每个类提供一个默认构造函数,但是当接触到bytecode等底层的代码时,这个构造函数是必须手动添加的。//创建Class文件 //以android开发为例,我们需要创建一个新的Activity类及其class文件 //activityName:新Activity类名 private SootClass createNewActivityClassFile(String activityName) { //如果已经存在该类,则不再创建 if(Scene.v().containsClass(activityName)) { return Scene.v().getSootClass(activityName); } // Resolve dependencies Scene.v().loadClassAndSupport("android.app.Activity"); Scene.v().loadClassAndSupport("android.os.Bundle"); Scene.v().loadClassAndSupport("android.content.Intent"); SootClass sClass; SootMethod method; sClass = new SootClass(activityName, Modifier.PUBLIC); sClass.setSuperclass(Scene.v().getSootClass("android.app.Activity")); Scene.v().addClass(sClass); createConstrutor(sClass);//添加构造函数,如果没有这一步,那么运行调用这个类时将会报错 createOnCreateMethod(sClass);//添加onCreate函数,或者其它自定义的函数 PackManager.v().writeClass(sClass); return sClass; }
private void createConstrutor(SootClass sClass) { SootMethod method = new SootMethod("<init>", Arrays.asList(new Type[] {}), VoidType.v(), Modifier.PUBLIC); sClass.addMethod(method); //添加body JimpleBody body = Jimple.v().newBody(method); method.setActiveBody(body); Chain<Unit> units = body.getUnits(); //添加this local Local thisLocal = Jimple.v().newLocal("this", sClass.getType()); body.getLocals().add(thisLocal); units.add(Jimple.v().newIdentityStmt(thisLocal, Jimple.v().newThisRef(sClass.getType()))); //调用init SootMethod oncreateMethod = Scene.v().getMethod("<android.app.Activity: void <init>()>"); SpecialInvokeExpr sie = Jimple.v().newSpecialInvokeExpr(thisLocal, oncreateMethod.makeRef()); units.add(Jimple.v().newInvokeStmt(sie)); // insert "return" units.add(Jimple.v().newReturnVoidStmt()); }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统