第〇章--在开始学习java逆向工程前需要知道什么?¶
术语:¶
1.限定名称(Qualified name):¶
用.分隔包名。例如Class.forName(name)的函数需要使用限定名称作为参数
举例:
java.lang.Stringcom.example.MyClass.InnerClass
注:只写最后一个类的名字,就是非限定名称。例如
import java.net.URL
URL a = new URL("www.baidu.com")//这里URL就是非限定名称,所以需要import
java.net.URL b = new java.net.URL("www.baidu.com")//和上面作用相同,但不需要import
2.内部名称(Internal name):¶
用/分隔包名。在$后接内部类名。内部名称是在.class类文件内部的类的名称
例如:
com/example/MyClass$InnerClass
3.原语(Primitives):¶
使用单个字符来表示原语(原语即不可再分的类型)
| 原语 | JVM中的描述 |
|---|---|
long | J |
int | I |
short | S |
byte | B |
boolean | Z |
float | F |
double | D |
void | V |
4.描述符(Descriptor):¶
描述符被用来描述字段和方法类型。几乎和JVM内部类型相同,只是类名被L与;包裹。
例如:
Ljava/lang/String;I(原语同上保持不变)
方法构造器格式举例:
double method(int i, String s)=(ILjava/lang/String;)Dvoid method()=()V
每一层数组被[前缀标记:
-
int[]=[I -
String[][]=[[Ljava/lang/String;
奇葩之处:double和long类型的变量占用两个槽位(无论是在操作栈还是在局部变量表上的)
用于匹配方法类型描述符的正则表达式示例:
^(\(((\[*L[^./\[;]([^./\[;]*[^.\[;][^./\[;])*;)|(\[*[ZBCSIJFD]+))*\))((\[*L[^./\[;]([^./\[;]*[^.\[;][^./\[;])*;)|V|(\[*[ZBCSIJFD]))$