【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )

简介: 【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )

文章目录

一、报错信息

二、解决方案





一、报错信息


使用场景 : 需要 Hook 住 View 的 OnClickListener 点击方法 , 该监听器在 View 的内部类 ListenerInfo 中 , 需要先通过反射 , 得到 ListenerInfo 字节码对象 ;


// 反射获取 OnClickListener 成员
// ① 先根据全类名获取 ListenerInfo 字节码
Class<?> clazz = null;
try {
    clazz = Class.forName("android.view.View.ListenerInfo");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}


报错信息 :


2021-06-17 10:28:27.453 31301-31301/com.example.plugin_hook W/System.err: java.lang.ClassNotFoundException: android.view.View.ListenerInfo
2021-06-17 10:28:27.453 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.Class.classForName(Native Method)
2021-06-17 10:28:27.453 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.Class.forName(Class.java:453)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.Class.forName(Class.java:378)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at com.example.plugin_hook.MainActivity.hook(MainActivity.java:67)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at com.example.plugin_hook.MainActivity.onCreate(MainActivity.java:32)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.Activity.performCreate(Activity.java:7144)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.Activity.performCreate(Activity.java:7135)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.os.Looper.loop(Looper.java:193)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6718)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View.ListenerInfo" on path: DexPathList[[zip file "/data/app/com.example.plugin_hook-IURzN0enGDqjeLown9_p1w==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.plugin_hook-IURzN0enGDqjeLown9_p1w==/lib/arm64, /system/lib64]]
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:     at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
2021-06-17 10:28:27.454 31301-31301/com.example.plugin_hook W/System.err:  ... 20 more
2021-06-17 10:28:27.456 31301-31301/com.example.plugin_hook E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.plugin_hook, PID: 31301
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.plugin_hook/com.example.plugin_hook.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.reflect.Field java.lang.Class.getField(java.lang.String)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.reflect.Field java.lang.Class.getField(java.lang.String)' on a null object reference
        at com.example.plugin_hook.MainActivity.hook(MainActivity.java:75)
        at com.example.plugin_hook.MainActivity.onCreate(MainActivity.java:32)
        at android.app.Activity.performCreate(Activity.java:7144)
        at android.app.Activity.performCreate(Activity.java:7135)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6718) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
2021-06-17 10:28:27.463 31301-31301/com.example.plugin_hook I/Process: Sending signal. PID: 31301 SIG: 9


image.png





二、解决方案


在此记录下 , 这种低级错误以后少犯 , 内部类要使用


包名.外部类$内部类


的形式 , 进行表示 ;


android.view.View$ListenerInfo


是 ListenerInfo 的正确表示方式 , 外部类与内部类之间使用 $ 符号 ;



修改后 :


// 反射获取 OnClickListener 成员
// ① 先根据全类名获取 ListenerInfo 字节码
Class<?> clazz = null;
try {
    clazz = Class.forName("android.view.View$ListenerInfo");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}


目录
相关文章
|
Java API Maven
精雕细琢的文档体验:Spring Boot 与 Knife4j 完美交汇
本文将深入探讨在 Spring Boot 项目中整合 Knife4j,这是一种基于 Swagger 的文档工具。通过使用 Knife4j,你可以轻松生成清晰、美观的 API 文档,提升你的项目文档管理水平。文章从基础概念到高级特性,带你领略 Knife4j 的独特魅力。
1281 5
|
机器学习/深度学习 并行计算 Shell
docker 获取Nvidia 镜像 | cuda |cudnn
本文分享如何使用docker获取Nvidia 镜像,包括cuda10、cuda11等不同版本,cudnn7、cudnn8等,快速搭建深度学习环境。
7218 0
hutool验证是否为中文字、英文字母、数字和下划线
hutool验证是否为中文字、英文字母、数字和下划线
|
API 开发者
提供一份 1688 商品详情接口的错误码及解决方法
本文介绍了 1688 商品详情接口常见的错误码及其解决方法,包括 401(未授权)、403(禁止访问)、404(未找到)、429(请求过多)和 500/502/504(服务器错误),帮助开发者快速定位并解决问题。
|
Java
java servlet 文件上传 req.getPart null 返回空值
java servlet 文件上传 req.getPart null 返回空值
254 0
|
关系型数据库 MySQL 测试技术
如何进行数据库的升级?
【7月更文挑战第21天】如何进行数据库的升级?
895 1
|
Java 数据库连接 API
Hibernate 中的标准 API 是什么?
【8月更文挑战第21天】
141 0
|
存储 分布式计算 Hadoop
Hadoop存储类型多样化
【4月更文挑战第15天】Hadoop提供多元化的存储选项,包括HDFS(适合大规模批量处理,如日志分析)和HBase(适用于实时查询的分布式列存储数据库)。Hadoop还支持TextFile(未压缩的行存储)和SequenceFile(压缩的二进制格式)等文件格式。压缩方式有记录压缩和块压缩,后者提升并行处理效率。根据场景需求选择合适存储类型和格式,确保高效、可靠的数据管理。
177 2
|
XML Dubbo Java
SpringBoot与Dubbo整合的几种方式
SpringBoot与Dubbo整合的几种方式
529 2
|
安全 Apache Swift
(六)Open Stack(M)----Horizon(Dashboard)安装和配置
(六)Open Stack(M)----Horizon(Dashboard)安装和配置
496 0