在上一篇文章《学习HandlerThread》我们提到虽然HandlerThread类里有getThreadHandler()方法得到Handler,但是我们不可能调用到它。因为这个方法用@hide注释了

/*** @return a shared {@link Handler} associated with this thread* @hide*/@NonNullpublic Handler getThreadHandler() {if (mHandler == null) {mHandler = new Handler(getLooper());}return mHandler;}

那么我们来看看@hide究竟是何方神圣。

如果我们的android项目的build.gradle配置了compileSdk 32,那么在我们编译我们android应用时,$ANDROID_SDK_HOME/platforms/android-32/android.jar就会加入我们编译时的类路径中,参与app的编译。@hide会控制我们编译时用到的这个android.jar包里的东西。

android.jar作为编译android本身的一部分被创建。Android framework的类会被分析,并创建它们的副本。这个副本有以下特点:

  • 去除被标注了@hide的类、方法、字段等
  • 所有剩下的方法都有stub实现,即throw new RuntimeException("Stub!")
  • 保留所有没有被去除的类、方法、字段的JavaDoc注解

我们使用javap命令查看一下android.os.HandlerThread.class里的东西:

% javap -verbose android/os/HandlerThread.class

从下面我们可以看到HandlerThread.class确实没有了getThreadHandler方法。

Classfile
***/adddd/android/android/os/HandlerThread.classLast modified Jan 1, 2008; size 1043 bytesSHA-256 checksum 8161f60748df5cf7489dbf189c3f4668d81a17595dbd55e52baa0f8263bb96d4Compiled from "HandlerThread.java"
public class android.os.HandlerThread extends java.lang.Threadminor version: 0major version: 52flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #5                          // android/os/HandlerThreadsuper_class: #6                         // java/lang/Threadinterfaces: 0, fields: 0, methods: 8, attributes: 1
Constant pool:#1 = Methodref          #6.#31         // java/lang/Thread."<init>":()V#2 = Class              #32            // java/lang/RuntimeException#3 = String             #33            // Stub!#4 = Methodref          #2.#34         // java/lang/RuntimeException."<init>":(Ljava/lang/String;)V#5 = Class              #35            // android/os/HandlerThread#6 = Class              #36            // java/lang/Thread#7 = Utf8               <init>#8 = Utf8               (Ljava/lang/String;)V#9 = Utf8               Code#10 = Utf8               LineNumberTable#11 = Utf8               LocalVariableTable#12 = Utf8               this#13 = Utf8               Landroid/os/HandlerThread;#14 = Utf8               name#15 = Utf8               Ljava/lang/String;#16 = Utf8               (Ljava/lang/String;I)V#17 = Utf8               priority#18 = Utf8               I#19 = Utf8               onLooperPrepared#20 = Utf8               ()V#21 = Utf8               run#22 = Utf8               getLooper#23 = Utf8               ()Landroid/os/Looper;#24 = Utf8               quit#25 = Utf8               ()Z#26 = Utf8               quitSafely#27 = Utf8               getThreadId#28 = Utf8               ()I#29 = Utf8               SourceFile#30 = Utf8               HandlerThread.java#31 = NameAndType        #7:#20         // "<init>":()V#32 = Utf8               java/lang/RuntimeException#33 = Utf8               Stub!#34 = NameAndType        #7:#8          // "<init>":(Ljava/lang/String;)V#35 = Utf8               android/os/HandlerThread#36 = Utf8               java/lang/Thread
{public android.os.HandlerThread(java.lang.String);descriptor: (Ljava/lang/String;)Vflags: (0x0001) ACC_PUBLICCode:stack=3, locals=2, args_size=20: aload_01: invokespecial #1                  // Method java/lang/Thread."<init>":()V4: new           #2                  // class java/lang/RuntimeException7: dup8: ldc           #3                  // String Stub!10: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V13: athrowLineNumberTable:line 23: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      14     0  this   Landroid/os/HandlerThread;0      14     1  name   Ljava/lang/String;public android.os.HandlerThread(java.lang.String, int);descriptor: (Ljava/lang/String;I)Vflags: (0x0001) ACC_PUBLICCode:stack=3, locals=3, args_size=30: aload_01: invokespecial #1                  // Method java/lang/Thread."<init>":()V4: new           #2                  // class java/lang/RuntimeException7: dup8: ldc           #3                  // String Stub!10: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V13: athrowLineNumberTable:line 25: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      14     0  this   Landroid/os/HandlerThread;0      14     1  name   Ljava/lang/String;0      14     2 priority   Iprotected void onLooperPrepared();descriptor: ()Vflags: (0x0004) ACC_PROTECTEDCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 27: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;public void run();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 29: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;public android.os.Looper getLooper();descriptor: ()Landroid/os/Looper;flags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 31: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;public boolean quit();descriptor: ()Zflags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 33: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;public boolean quitSafely();descriptor: ()Zflags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 35: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;public int getThreadId();descriptor: ()Iflags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: new           #2                  // class java/lang/RuntimeException3: dup4: ldc           #3                  // String Stub!6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V9: athrowLineNumberTable:line 37: 0LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   Landroid/os/HandlerThread;
}
SourceFile: "HandlerThread.java"

这里再介绍一下从这个HandlerThread.class里面看到的一些信息:

  • minor version: 0 major version: 52:表示当前这个.class文件是用哪个编译器生产的
JDK Version (in Decimal) Major Version
Java SE 8.0 52
Java SE 11.0 55
  • Compiled from “HandlerThread.java”:说明.class文件是由这"HandlerThread.java"编译而来的

关于@hide的理解相关推荐

  1. vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...

    今天主要讲的是虚函数的override与overload的区别.首先我们来看一段代码: 示例代码 #include <stdio.h> #include <string> #i ...

  2. 深入理解 wpa_supplicant(三)

    本文为<深入理解Android Wi-Fi.NFC和GPS卷>读书笔记,Android源码为Android 5.1 android-5.1/external/wpa_supplicant_ ...

  3. 一个经典例子让你彻彻底底理解java回调机制

    以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中 ...

  4. Java反射实践:从反射中理解class

    写在前面 今天在需求评审的时候,遇到了挺有意思的要求.需求是什么样子就不说了.总之完成这个需求需要一个调用系统api的操作.然而这个api因为并不稳定的原因.被谷歌hide掉了. 这个时候我们最直接的 ...

  5. 深入理解WMS(二):Dialog与Toast源码解析

    作者:ScottStone 链接:https://www.jianshu.com/p/1090d6c33dec 通过上面的分析可以看出,View是Android中的视图呈现方式,但是View并不能单独 ...

  6. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  7. hdu hide handkerchief

    hide handkerchief Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  9. EXT学习经验分享:深刻理解EXT与服务器端的交互

    EXT是一款强大的AJAX框架,其UI设计非常华丽,所以在对UI要求高的项目中可以使用!         前面一段时间发了一篇封装的EXT CRUD面板,地址为http://www.phpchina. ...

最新文章

  1. JavaScript---认识JavaScipt
  2. [Spring cloud 一步步实现广告系统] 9. 主类和配置文件
  3. RPL的故事 ——《x86汇编语言:从实模式到保护模式》读书笔记31
  4. 如何通过递归找父节点或子节点详解
  5. couchdb 自动生成html,如何在CouchDB中使用html模板
  6. SQL server报错42000 - [SQL Server]从数据类型 varchar 转换为 int 时出错。
  7. linux的定时任务有多耗资源,linux定时任务的一些相关操作汇总
  8. Nssm Edit XXX
  9. Bailian2717 基本数据类型【字符串匹配】
  10. C# Lamda中类似于SQL 中的 In 功能
  11. 况客:Campisi债券业绩归因模型
  12. 邮件服务器漏洞攻击,Exim邮件服务中的严重漏洞分析
  13. InstallShield教程-打包.NET程序
  14. 【招聘测评题】中的(行测)图形推理题基本逻辑总结(附例题)
  15. 手把手教你使用R语言绘制交互效应的森林图
  16. CS院校解析 | 清华大学深圳国际研究生院
  17. 修改win10更新后自动修改的浅绿色背景
  18. wxPay微信支付订单提交提示「订单号重复」问题
  19. 英语语音篇 - 自然拼读大全
  20. 微信无法连接服务器10,微信无法连接到服务器【应对方式】

热门文章

  1. 2021年浙江省跨境电商行业发展概况及发展趋势分析[图]
  2. 用户正确使用趋势跟随的交易系统的方法
  3. 异硫氰酸荧光素(FITC)标记的抗人IL-1ra单克隆抗体,FITC-IL-1ra
  4. eclipse简介及下载
  5. BBN:Bilateral-Branch network with cumulative learning for long-tailed visual recognition
  6. 设计模式 - 创建型模式_工厂方法模式
  7. 多校冲刺NOIP模拟6 - 游戏——矩阵乘法、后缀自动机SAM
  8. 快来体验一下,让你的浏览器焕然一新
  9. tcp支持浏览器websocket协议
  10. 2022年认证杯SPSSPRO杯数学建模C题(第一阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序