java中modifier_Java Modifier工具类
他山之石,可以攻玉。
阅读源码是我们与大师交流的唯一途径,如果放弃了,难道要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工具类相关推荐
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
- 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...
- java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载
详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...
- java中常用的工具类
1. 常用零散工具类 1.1[DateUtil.java]日期处理的工具类 /*** 时间日期处理工具* String -> Date* Date -> String* 以及生成含有日期的 ...
- Java中使用UUID工具类生成唯一标志防止重复
场景 UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息. 在某些场景下需要给数据库中 ...
- Java 中的并发工具类
From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计. 学习了 AQS 后再了 ...
- 【Java】Java中的常用工具类(排名前 16)
文章目录 前言 一.org.apache.commons.io.IOUtils 二.org.apache.commons.io.FileUtils 三.org.apache.commons.lang. ...
- Java中的数字工具类-----持续总结中
标题 java获取任意数字的个位,十位,百位,千位,万位... JAVA实现数值跟人民币大写(中文简体.繁体)互转 Java实现数值金额指定分割符 java代码去除千分号 BigDecimal判空处理 ...
- 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch
上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...
- java获取属性工具类,Java中常用的工具类总结
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 有了这些轮子,会使代码更加简洁,优美, 但是需要经常看看大佬的源码, 这样才会有进步! 不能光会用 ...
最新文章
- RDKit入门与进阶教程(30篇)
- linux挂载文件夹查看命令,findmnt命令查找已挂载的文件系统
- TCP的困境与解决方案
- leetcode 767. Reorganize String | 767. 重构字符串(贪心+分桶+26路归并)
- [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)
- php代码规范说明文档
- 牛客网数据开发题库_数据库刷题—牛客网(21-30)
- 使用Mockito对类成员变量进行Mock
- Django之form组件!
- 第一台全自动电子计算机,关于世界上第一台电子计算机ENIAC的叙述错误的是() senny全自动微电脑水位控制仪...
- 利用Delphi编写屏幕保护程序
- 埃默里大学有计算机专业吗,埃默里大学计算机科学硕士排名第30(2020年TFE Times排名)...
- 谷歌、百度、搜狗、有道搜索个人之比较
- 新能源车牌识别系统的设计与实现
- nlohmann json用法
- python 打包命令以及使用方法
- 飞速创软 | 带你深入了解Iass、Pass、Sass三种云服务的区别
- SvnServer安装使用简介
- 第七章 将文件内容复制到另外文件
- RocEDU.阅读.写作《苏菲的世界》书摘(四)