Java/Android API调用描述中$符号的含义是什么?
Dalvik字节码描述符中$符号的含义说明
你在Androguard中采集到的带$符号的字符串是Dalvik/ART虚拟机使用的类方法描述符,其中$是字节码层面标记内部类的固定分隔符,和其他编程语言中的变量引用作用完全无关。
Java/Kotlin 等JVM系语言编译为字节码时,对嵌套类(包括静态内部类、非静态内部类、匿名内部类)会采用 外部类名$内部类名 的固定命名规则,Android应用编译生成的dex字节码沿用了这套命名规则,具体对应你给出的示例:
Ljava/util/Locale$LanguageRange/<init>:表示java.util.Locale的内部类LanguageRange的构造方法,<init>是字节码中构造方法的固定标记Lcom/google/android/gms/vision/barcode/BarcodeDetector$Builder/setBarcodeFormats:表示BarcodeDetector的静态内部类Builder的setBarcodeFormats成员方法,这是Android开发中常见的Builder设计模式实现- 不带$的
Lcom/google/android/gms/vision/Tracker/<init>:表示Tracker是没有嵌套关系的独立顶层类
API调用追踪场景的实际意义
- 可以直接通过$的位置快速拆分出外部类、内部类的层级关系,不需要反编译回源代码就能判断类的嵌套结构
- 如果需要把描述符转换为常规Java类名写法,直接把$替换为
.即可,例如Locale$LanguageRange对应常规写法Locale.LanguageRange - 部分匿名内部类的描述符会出现
外部类$1、外部类$2的格式,末尾的数字是编译器给匿名内部类自动分配的序号,没有业务含义,仅用于区分不同的匿名内部类
内容的提问来源于stack exchange,提问作者Riddick
相关产品推荐
相关产品推荐

