他山之石,可以攻玉。

阅读源码是我们与大师交流的唯一途径,如果放弃了,难道要CRUD到白头吗?

故事也是从这里开始。

起源

观看dubbo官网的时候,在源码导读-服务导出这一节看到一个陌生的Api我十分感兴趣。本着见名知意的原则,猜测了一下大概是判断一个类是否被public修饰符修饰。

发展

查了一下JDK源码对此的解释:

Returns the Java language modifiers for this class or interface, encoded

in an integer复制代码

翻译一下:返回此类或接口的Java语言修饰符,以整数编码的形式。

public class JavaClass{

private final Class abstractPojoClass;

private final Class interFacePojoClass;

public JavaClass(){

abstractPojoClass = AbstractPojo.class;

interFacePojoClass = InterFacePojo.class;

}

public static void main(String[] args){

JavaClass javaClass = new JavaClass();

javaClass.isInterFace();

javaClass.isAbstract();

}

/**

* 判断是否为接口类

*/

private void isInterFace(){

boolean anInterface = interFacePojoClass.isInterface();

boolean isInterface = Modifier.isInterface(interFacePojoClass.getModifiers());

System.out.println(anInterface && isInterface);

}

/**

* 判断是否为抽象类

* fixme: Class貌似没有提供判断方法,需要借助 Modifier

* 同时 {@link Modifier} 提供大量的检测方法

*/

private void isAbstract(){

boolean anAbstract = Modifier.isAbstract(abstractPojoClass.getModifiers());

System.out.println(anAbstract);

}

}

复制代码

结果符合预期:

高潮

抱着好读书,求甚解的态度,我翻开了Modifier的源码。

发现ta的实现十分简短,仅仅使用了一次 & 运算足矣。

public static boolean isInterface(int mod){

return (mod & INTERFACE) != 0;

}

public static boolean isAbstract(int mod){

return (mod & ABSTRACT) != 0;

}

复制代码

然后我又查阅了一下常量的含义。

public static final int ABSTRACT = 0x00000400;

public static final int INTERFACE = 0x00000200;

复制代码

这两个常量就是一个十六进制的数字而已,也没有特殊之处。往上翻了翻:发现Modifier内部定义了大量的常量。而且这些常量都是十六进制八位数,转化成二进制其实就是三十二位。

我还发现了volatile关键字,那可以说明除了Class,Field应该也具备getModifiers()方法。

除此之外我们还见到了眼熟的synchronized关键字,ta可以用来修饰方法。想必Method应该也具备getModifiers()方法。

其实看到这里原理我已经猜出了一个大概。

我的猜想:一定是用0或者1来表示是否,每一位则表示不同的涵义

比如最后一位表示是否被public修饰

倒数第二位表示是否被private修饰

倒数第三位表示是否被protected修饰

我们就用最简单的public来验证我的猜想。

public static boolean isPublic(int mod){

return (mod & PUBLIC) != 0;

}

复制代码

按照源码推算如果被public关键字修饰那么getModifiers()得到的值最后一位必须为1。

public class Test{

public static void main(String[] args){

System.out.println("pojo:" + Integer.toBinaryString(Pojo.class.getModifiers()));

System.out.println("抽象类:" + Integer.toBinaryString(AbstractPojo.class.getModifiers()));

System.out.println("接口:" + Integer.toBinaryString(InterFacePojo.class.getModifiers()));

System.out.println(Integer.toBinaryString(pri.class.getModifiers()));

System.out.println(Integer.toBinaryString(pro.class.getModifiers()));

}

private class pri{

}

protected class pro{

}

}

复制代码

二进制输出得到的值,如果结果前三个是末位是1,且后两个末位不为1方能验证我们的的猜想。

完美符合预期。其实其他的证明方式都一样不妨自己多尝试。

其实原理十分简单,只要熟悉 & 的运算规则即可。

尾声

荆公曾言:世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。

愿与诸君互勉之......

java中modifier_Java Modifier工具类相关推荐

  1. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  2. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  3. java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...

  4. java中常用的工具类

    1. 常用零散工具类 1.1[DateUtil.java]日期处理的工具类 /*** 时间日期处理工具* String -> Date* Date -> String* 以及生成含有日期的 ...

  5. Java中使用UUID工具类生成唯一标志防止重复

    场景 UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息. 在某些场景下需要给数据库中 ...

  6. Java 中的并发工具类

    From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计. 学习了 AQS 后再了 ...

  7. 【Java】Java中的常用工具类(排名前 16)

    文章目录 前言 一.org.apache.commons.io.IOUtils 二.org.apache.commons.io.FileUtils 三.org.apache.commons.lang. ...

  8. Java中的数字工具类-----持续总结中

    标题 java获取任意数字的个位,十位,百位,千位,万位... JAVA实现数值跟人民币大写(中文简体.繁体)互转 Java实现数值金额指定分割符 java代码去除千分号 BigDecimal判空处理 ...

  9. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

  10. java获取属性工具类,Java中常用的工具类总结

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 有了这些轮子,会使代码更加简洁,优美, 但是需要经常看看大佬的源码, 这样才会有进步! 不能光会用 ...

最新文章

  1. RDKit入门与进阶教程(30篇)
  2. linux挂载文件夹查看命令,findmnt命令查找已挂载的文件系统
  3. TCP的困境与解决方案
  4. leetcode 767. Reorganize String | 767. 重构字符串(贪心+分桶+26路归并)
  5. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)
  6. php代码规范说明文档
  7. 牛客网数据开发题库_数据库刷题—牛客网(21-30)
  8. 使用Mockito对类成员变量进行Mock
  9. Django之form组件!
  10. 第一台全自动电子计算机,关于世界上第一台电子计算机ENIAC的叙述错误的是() senny全自动微电脑水位控制仪...
  11. 利用Delphi编写屏幕保护程序
  12. 埃默里大学有计算机专业吗,埃默里大学计算机科学硕士排名第30(2020年TFE Times排名)...
  13. 谷歌、百度、搜狗、有道搜索个人之比较
  14. 新能源车牌识别系统的设计与实现
  15. nlohmann json用法
  16. python 打包命令以及使用方法
  17. 飞速创软 | 带你深入了解Iass、Pass、Sass三种云服务的区别
  18. SvnServer安装使用简介
  19. 第七章 将文件内容复制到另外文件
  20. RocEDU.阅读.写作《苏菲的世界》书摘(四)

热门文章

  1. 沈阳市中考计算机考试时间,2021辽宁沈阳中考考试时间、科目分值及时间轴
  2. RPL-UDP的cooja仿真过程
  3. 分享你喜欢的杀毒软件
  4. 关于电子科技大学大学生早自习情况调查
  5. MySQL中explain用法含义说明
  6. mysql explain关键字解析
  7. 支付宝APP支付——支付流程说明及示例
  8. python输入整数输出英文_python练习 英文字符的鲁棒输入+数字的鲁棒输入
  9. Adolescent Architecture
  10. 资源管理器计算机目录,资源管理器可以以什么方式显示计算机内所有文件的详细图表...