Soot:从头创建一个类
来源:互联网 发布:陈华伟 知乎 编辑:程序博客网 时间:2024/06/04 23:31
Soot:从头创建一个类
(Creating a class from scratch)
首先,我们需要创建一个类,以放入方法。接下来的步骤对于创建一个类文件是必要的。
加载Java.lang.Object和Library类
加载java.lang.Object,Java类层次结构的root节点。
该步骤对于那些扩展Soot框架的构建代码来说,是没必要的。在那种情况下,当用户代码被调用时,类文件就已经被加载了。
Scene.v().loadClassAndSupport("java.lang.Object");
该行代码使得Soot去加载java.lang.Object类,并创建其对应的SootClass对象,也包括与其成员对应的SootMethod(s)和SootField(s)。当然java.lang.Object有着对其它对象的引用。loadClassAndSupport方法的调用,将加载指定类的传递闭包(transitive closure),以便所有为了加载java.lang.Object所需的类型能被加载。
这一过程被称为resolution。
因为我们的HelloWorld程序将使用标准库中的类,我们也需要解析(resolve)它们:
Scene.v().loadClassAndSupport("java.lang.System");
该行引用了Scene.v()。Scene是指在程序中所有SootClass(es)的容器,并且提供了各种实用的方法。有一个单例的Scene对象,可以通过Scene.v()来调用获取。
注意事项:Soot从类文件或.jimple的输入文件中加载这些类。当使用的是前者的话,Soot将加载所有在每个类文件的常量池中获取到的类名。从Jimple中加载时,Soot将只加载要求的类型。
创建一个新的SootClass对象
创建一个"HelloWorld"类,并设置它的超类为"java.lang.Object"。
SootClass sClass = new SootClass("HelloWorld",Modifier.PUBLIC);
该行代码为一个名为HelloWorld的Public类创建SootClass对象。
sClass.setSuperClass(Scene.v().getSootClass("java.lang.Object"));
这将为这个新创建的类设置相应于java.lang.Object的SootClass对象,作为其超类。注意这里Scene的getSootClass功能方法的使用。
Scene.v().addClass(sClass);
这将添加新创建的HelloWorld类Scene中。所有的类,一旦它创建后,都应该归属到Scene中。
添加方法到SootClass中
为HelloWorld创建一个含有空方法体的main()方法。
现在,我们拥有一个SootClass,我们需要为其添加方法。
SootMethod method = new SootMethod("main",
Arrays.asList(new Type[]{ArrayType.v(RefType.v("java.lang.String"),1)}),
VoidType.v(), Modifier.Public | Modifier.STATIC);
我们创建了一个public static方法,main,声明了它携带了一个java.lang.String的对象,并且它返回void。
SootMethod的构造器要求一个list,所以我们使用Java实用方法Arrays.asList来从单元素数组(我们从newType[]中生成)中创建一个list。在该列表中,我们装入一个数组类型,对应于java.lang.String对象的一维数组类型。
Types: 每个SootClass表示一个Java对象。我们可以实例化该类,通过指定一个类的给定类型。两个概念:--type和class--密切相关,但带有区分。为了获取java.lang.Stirng类的type,通过名字,我们调用RefType.v("java.lang.String")。给定一个SootClass对象sc,我们也可以调用sc.getType()来获取对应的类型。
sClass.addMethod(method);
这一代码将方法添加到包含它的类中。
为方法添加代码
方法如果不包含代码则没有意义。我们为main方法添加一些代码。为了达到该目的,我们需要为该代码选择一种中间表示。
创建JimpleBody
未完待续。
自我吐槽:
做博客需要莫大的耐心,给自己打打气加油。
在公司内部无法做任何总结或博客真是非常糟糕的体验,只能每晚回家抽空总结,身子真是吃不消。
坚持!
- Soot:从头创建一个类
- Soot:从头创建一个类
- soot基础 -- 从头开始创建一个类
- Soot 学习笔记 5:使用 Soot 创建 Java class
- soot
- Creating a class from scratch(从头开始创建一个类)
- 从头创建一个基于 React, webpack, babel 的模板项目
- 从头创建一个基于react,webpack,babel的项目
- 从头创建一个简单的RPC服务框架
- 从头创建一个基于 React, webpack, babel 的模板项目
- Soot 学习笔记 6:一些 Soot 重要的类
- 从头开始创建新图像
- 从头写一个rtsp服务器
- 从头开始绘制一个球体
- 从头开始绘制一个圆锥体
- 从头开始实现一个神经网络
- 从头开始构建一个应用
- 从头开始教你创建一个自定义可视化的Winows Form控件(Divider Panel)--For Begnners
- Nginx安装及配置
- PYTHON 词图/WordCloud,
- Animals and Puzzle codeforces 713D 二维 rmq+二分+dp(算模板了)
- 百度贴吧终于支持修改昵称
- NYOJ:35-表达式求值
- Soot:从头创建一个类
- (1614 [Usaco2007 Jan]Telephone Lines架设电话线)
- UESTC 1608 暑假集训
- 为什么linux select函数的第一个参数总应该是fdmax + 1 ?
- 【HTML5学习笔记】17:CSS选择器 下
- C++学习摘要记录(1)
- NYOJ:37-回文字符串
- composer
- 访问者模式--要风得风,要雨得雨(行为模式11)