超级通道: Java泛型学习系列-绪论

java.lang.reflect.Modifier类提供了用于获取和转换修饰符(即public,private,static等等的关键字)的静态方法。

1.通过Modifier可以做什么

通过Modifier可以做以下事情:

  • 可以获取每个Java修饰符对应的int值
  • 可以将int值转换成相应的Java修饰符
  • 可以判断某个int值是否能转换成一个修饰符
  • 可以获取所有接口(interface)的修饰符
  • 可以获取所有类(Class)的修饰符
  • 可以获取所有构造器(Constructor)的修饰符
  • 可以获取所有字段(Field)的修饰符
  • 可以获取所有方法(Method)的修饰符

2.代码示例

/*** <p>java.lang.reflect.Modifier示例</p>** @author hanchao 2018/2/27 21:19**/
public class ReflectModifierDemo {private static final Logger LOGGER = Logger.getLogger(ReflectModifierDemo.class);/*** <p>java反射-修饰符 示例</p>** @author hanchao 2018/2/27 21:19**/public static void main(String[] args) {//通过Modifier.toString(modifier)可以将十进制值解析成对应的修饰符LOGGER.info("通过Modifier.toString(modifier)可以将十进制值解析成对应的修饰符");LOGGER.info("Modifier.toString(1) = " + Modifier.toString(1));LOGGER.info("Modifier.toString(2) = " + Modifier.toString(2) + "\n");//通过Modifier.isZzzz(1)[Zzzz=全部修饰符]判断是否为某个修饰符LOGGER.info("通过Modifier.isZzzz(1)[Zzzz=全部修饰符]判断是否为某个修饰符");LOGGER.info("Modifier.isPublic(1) = " + Modifier.isPublic(1));LOGGER.info("Modifier.isPublic(2) = " + Modifier.isPublic(2) + "\n");//通过Modifier.xxxModifiers可以获取某项目(interface/class/constructor/field/method/)对应的所有修饰符LOGGER.info("通过Modifier.xxxModifiers可以获取某项目(interface/class/constructor/field/method/)对应的所有修饰符");LOGGER.info("Modifier.toString(Modifier.interfaceModifiers()) = " + Modifier.toString(Modifier.interfaceModifiers()));LOGGER.info("Modifier.toString(Modifier.classModifiers()) = " + Modifier.toString(Modifier.classModifiers()));LOGGER.info("Modifier.toString(Modifier.constructorModifiers()) = " + Modifier.toString(Modifier.constructorModifiers()));LOGGER.info("Modifier.toString(Modifier.fieldModifiers()) = " + Modifier.toString(Modifier.fieldModifiers()));LOGGER.info("Modifier.toString(Modifier.methodModifiers()) = " + Modifier.toString(Modifier.methodModifiers()) + "\n");//通过Modifier.FIELD可以获取每个修饰符对应的十进制值和十六进制值LOGGER.info("通过Modifier.FIELD可以获取每个修饰符对应的十进制值和十六进制值");LOGGER.info("Modifier.PUBLIC = " + Modifier.PUBLIC + " = 0x" +String.format("%08x",Modifier.PUBLIC));LOGGER.info("Modifier.PRIVATE = " + Modifier.PRIVATE + " = 0x" +String.format("%08x",Modifier.PRIVATE));LOGGER.info("Modifier.PROTECTED = " + Modifier.PROTECTED + " = 0x" +String.format("%08x",Modifier.PROTECTED));LOGGER.info("Modifier.STATIC = " + Modifier.STATIC + " = 0x" +String.format("%08x",Modifier.STATIC));LOGGER.info("Modifier.FINAL = " + Modifier.FINAL + " = 0x" +String.format("%08x",Modifier.FINAL));LOGGER.info("Modifier.SYNCHRONIZED = " + Modifier.SYNCHRONIZED + " = 0x" +String.format("%08x",Modifier.SYNCHRONIZED));LOGGER.info("Modifier.VOLATILE = " + Modifier.VOLATILE + " = 0x" +String.format("%08x",Modifier.VOLATILE));LOGGER.info("Modifier.TRANSIENT = " + Modifier.TRANSIENT + " = 0x" +String.format("%08x",Modifier.TRANSIENT));LOGGER.info("Modifier.NATIVE = " + Modifier.NATIVE + " = 0x" +String.format("%08x",Modifier.NATIVE));LOGGER.info("Modifier.INTERFACE = " + Modifier.INTERFACE + " = 0x" +String.format("%08x",Modifier.INTERFACE));LOGGER.info("Modifier.ABSTRACT = " + Modifier.ABSTRACT + " = 0x" +String.format("%08x",Modifier.ABSTRACT));LOGGER.info("Modifier.STRICT = " + Modifier.STRICT + " = 0x" +String.format("%08x",Modifier.STRICT) + "\n");//一个由十六进制(取值范围:001~800)值组合的值,可以代表多个修饰符LOGGER.info("一个由十六进制(取值范围:001~800)值组合的值,可以代表多个修饰符");LOGGER.info("Modifier.toString(1 + 4 + 512) = " + Modifier.toString(1 + 4 + 512));LOGGER.info("Modifier.constructorModifiers() = " + Modifier.constructorModifiers() + " = " + Modifier.toString(Modifier.constructorModifiers()));}
}

3.运行结果

2018-03-03 23:18:32 INFO  ReflectModifierDemo:22 - 通过Modifier.toString(modifier)可以将十进制值解析成对应的修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:23 - Modifier.toString(1) = public
2018-03-03 23:18:32 INFO  ReflectModifierDemo:24 - Modifier.toString(2) = private2018-03-03 23:18:32 INFO  ReflectModifierDemo:27 - 通过Modifier.isZzzz(1)[Zzzz=全部修饰符]判断是否为某个修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:28 - Modifier.isPublic(1) = true
2018-03-03 23:18:32 INFO  ReflectModifierDemo:29 - Modifier.isPublic(2) = false2018-03-03 23:18:32 INFO  ReflectModifierDemo:32 - 通过Modifier.xxxModifiers可以获取某项目(interface/class/constructor/field/method/)对应的所有修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:33 - Modifier.toString(Modifier.interfaceModifiers()) = public protected private abstract static strictfp
2018-03-03 23:18:32 INFO  ReflectModifierDemo:34 - Modifier.toString(Modifier.classModifiers()) = public protected private abstract static final strictfp
2018-03-03 23:18:32 INFO  ReflectModifierDemo:35 - Modifier.toString(Modifier.constructorModifiers()) = public protected private
2018-03-03 23:18:32 INFO  ReflectModifierDemo:36 - Modifier.toString(Modifier.fieldModifiers()) = public protected private static final transient volatile
2018-03-03 23:18:32 INFO  ReflectModifierDemo:37 - Modifier.toString(Modifier.methodModifiers()) = public protected private abstract static final synchronized native strictfp2018-03-03 23:18:32 INFO  ReflectModifierDemo:40 - 通过Modifier.FIELD可以获取每个修饰符对应的十进制值和十六进制值
2018-03-03 23:18:32 INFO  ReflectModifierDemo:41 - Modifier.PUBLIC = 1 = 0x00000001
2018-03-03 23:18:32 INFO  ReflectModifierDemo:42 - Modifier.PRIVATE = 2 = 0x00000002
2018-03-03 23:18:32 INFO  ReflectModifierDemo:43 - Modifier.PROTECTED = 4 = 0x00000004
2018-03-03 23:18:32 INFO  ReflectModifierDemo:44 - Modifier.STATIC = 8 = 0x00000008
2018-03-03 23:18:32 INFO  ReflectModifierDemo:45 - Modifier.FINAL = 16 = 0x00000010
2018-03-03 23:18:32 INFO  ReflectModifierDemo:46 - Modifier.SYNCHRONIZED = 32 = 0x00000020
2018-03-03 23:18:32 INFO  ReflectModifierDemo:47 - Modifier.VOLATILE = 64 = 0x00000040
2018-03-03 23:18:32 INFO  ReflectModifierDemo:48 - Modifier.TRANSIENT = 128 = 0x00000080
2018-03-03 23:18:32 INFO  ReflectModifierDemo:49 - Modifier.NATIVE = 256 = 0x00000100
2018-03-03 23:18:32 INFO  ReflectModifierDemo:50 - Modifier.INTERFACE = 512 = 0x00000200
2018-03-03 23:18:32 INFO  ReflectModifierDemo:51 - Modifier.ABSTRACT = 1024 = 0x00000400
2018-03-03 23:18:32 INFO  ReflectModifierDemo:52 - Modifier.STRICT = 2048 = 0x000008002018-03-03 23:18:32 INFO  ReflectModifierDemo:54 - 一个由十六进制(取值范围:001~800)值组合的值,可以代表多个修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:55 - Modifier.toString(1 + 4 + 512) = public protected interface
2018-03-03 23:18:32 INFO  ReflectModifierDemo:56  - Modifier.constructorModifiers() = 7 = public protected private

4.静态方法分析

结合实例代码与运行结果,进行以下总结:

4.1.Modifier.toString(mod)

通过Modifier.toString(mod)将十进制值转化成修饰符关键字。如:

2018-03-03 23:18:32 INFO  ReflectModifierDemo:22 - 通过Modifier.toString(modifier)可以将十进制值解析成对应的修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:23 - Modifier.toString(1) = public
2018-03-03 23:18:32 INFO  ReflectModifierDemo:24 - Modifier.toString(2) = private

4.2.Modifier.isXxxx(mod)

通过Modifier.isXxxx(mod)判断十进制值是否是某种修饰符,如:

2018-03-03 23:18:32 INFO  ReflectModifierDemo:27 - 通过Modifier.isZzzz(1)[Zzzz=全部修饰符]判断是否为某个修饰符
2018-03-03 23:18:32 INFO  ReflectModifierDemo:28 - Modifier.isPublic(1) = true
2018-03-03 23:18:32 INFO  ReflectModifierDemo:29 - Modifier.isPublic(2) = false

4.3.Modifier.xxxModifiers()

通过Modifier.xxxModifiers()可以获取相关类型所允许的修饰符。
其中xxx可取的值有:
interface、class、constructor、field、method。

各类型分别允许的修饰符如下表所示:

序号 类型 修饰符
1 interface public protected private abstract static strictfp
2 class public protected private abstract static final strictfp
3 constructor public protected private
4 field public protected private static final transient volatile
5 method public protected private abstract static final synchronized native strictfp

4.4.Modifier.XXXXX

通过Modifier.XXXXX能够获取某个修饰符对应的十进制值。
其中XXXXX可取的值有12种:
PUBLIC、PRIVATE、PROTECTED、STATIC、FINAL、SYNCHRONIZED、
VOLATILE、TRANSIENT、NATIVE、INTERFACE、ABSTRACT、STRICT。

通过运行结果,关于Java修饰符对应的十进制和十六进制值,很容整理成如下表格:

序号 修饰符 Modifier对应字段 十进制值 十六进制值
1 public Modifier.PUBLIC 1 0x00000001
2 private Modifier.PRIVATE 2 0x00000002
3 protected Modifier.PROTECTED 4 0x00000004
4 static Modifier.STATIC 8 0x00000008
5 final Modifier.FINAL 16 0x00000010
6 synchronized Modifier.SYNCHRONIZED 32 0x00000020
7 volatile Modifier.VOLATILE 64 0x00000040
8 transient Modifier.TRANSIENT 128 0x00000080
9 native Modifier.NATIVE 256 0x00000100
10 interface Modifier.INTERFACE 512 0x00000200
11 abstract Modifier.ABSTRACT 1024 0x00000400
12 strict Modifier.STRICT 2048 0x00000800

通过分析:

各个修饰符都可以转换成一个十六进制值

各个修饰符的十进制值是倍数关系

通过多个修饰符的和值可以反推出这些修饰符的值
如:
517只能分解成1+4+512,即:public protected interface
同理,
Modifier.constructorModifiers() = 7,而7只能分解成1+2+4,即:public protected private

5.总结

  • 通过Modifier.FIELD可以获取每个Java修饰符对应的十进制值和十六进制值
  • 通过Modifier.toString(modifier)可以将int值转换成相应的Java修饰符
  • 通过Modifier.isZzzz(modifier)[Zzzz=全部修饰符]可以判断某个int值是否能转换成一个修饰符
  • 通过Modifier.interfaceModifiers()可以获取所有接口(interface)的修饰符
  • 通过Modifier.classModifiers()可以获取所有类(Class)的修饰符
  • 通过Modifier.constructorModifiers()可以获取所有构造器(Constructor)的修饰符
  • 通过Modifier.fieldModifiers()可以获取所有字段(Field)的修饰符
  • 通过Modifier.methodModifiers()可以获取所有方法(Method)的修饰符

Java反射05 : 修饰符Modifier静态方法学习示例相关推荐

  1. java 反射获取修饰符_java之反射和BeanUtils类

    反射和BeanUtils类 1. 类的初始化:类什么什么情况下会加载到内存中 只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象 2. javaBean:数据库中的表和java中的 ...

  2. java 反射 方法 修饰符_超类中使用默认修饰符的Java反射访问方法

    Method method = getClass().getSuperclass().getDeclaredMethod("doSomething"); method.invoke ...

  3. java中访问修饰符_Java中的非访问修饰符是什么?

    java中访问修饰符 Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name o ...

  4. Java中权限修饰符

    Java中访问修饰符public.private.protect.default范围   同一个类 同一个包 不同包的子类 不同包的非子类 Private √ Default √ √ Protecte ...

  5. 关于Java中各种修饰符与访问修饰符的说明

    关于Java中各种修饰符与访问修饰符的说明 类: 访问修饰符  修饰符  class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 ...

  6. Java非访问修饰符

    Java非访问修饰符 为了实现一些其他的功能,Java 也提供了许多非访问修饰符. Static:修饰符,用来创建类方法和类变量. Final:修饰符,用来修饰类.方法和变量,final修饰的类不能够 ...

  7. java中访问修饰符_Java中的访问修饰符介绍

    java中访问修饰符 什么是访问修饰符? (What are Access Modifiers?) Have you ever wanted to define how people would ac ...

  8. Java-Day11 面向对象遍程的入门 (类属性的默认值、构造方法、类的成员、static关键字、类的成员加载顺序、Java(权限)访问修饰符)

    目录 1. 类的属性的默认值问题 2. 构造方法(Constructor) 3. 类的成员 3.1 类的成员之一:属性 3.2 UML类图 4. static关键字 5. 类的成员加载(运行)顺序 6 ...

  9. Java 中的修饰符总结

    学习了编写 Java 程序中的修饰符总结,而在编写Java程序时,都会遇到Java中的修饰符总结.所以往下面学习时,应当注意以下几点: 修饰符总结:四个访问控制符:注意:在不写访问控制符的情况下,就是 ...

  10. java默认访问修饰符是,java默认访问修饰符

    java.lapplet.Applet D. java.awt.Frame XXX13.下列选项中,哪个方法不是 JAVA 的访问修饰符(C) A. private B. protected C. f ...

最新文章

  1. Edge Linking
  2. 一道百度前端线上笔试题
  3. formdata怎么传数组_如何使用formData上传file数组
  4. SAP Spartacus的site context配置
  5. 计算数字的出现次数 java_关于Java:如何计算数字在.txt文件中出现的次数
  6. spring bean创建细节
  7. 【转载】COM 组件设计与应用(二)——GUID 和 接口
  8. it just sudo_just do it是什么梗
  9. 爬虫实现原理与实现技术
  10. mysql centos7安装_Linux——CentOS7之mysql5.7安装与配置
  11. tpl_main_page.php
  12. Python对象转json【包括嵌套对象转json,django的model转json】
  13. 介绍5款非常棒的移动自动化测试工具
  14. 深大uooc学术道德与学术规范教育第四章
  15. 让你一遍就会的【单纯形法解线性规划最优】
  16. H5移动端禁止长按保存图片
  17. python语音特征提取_使用Python从视频中提取语音
  18. 【技巧】arcgis制图设置经纬网同时置于最底层
  19. 代码阅读——十个C开源项目
  20. 读心术python_有哪些厉害的观人术读心术?

热门文章

  1. 解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题
  2. 电源防反接电路 供电自动切换电路 - MOS管体二极管的应用
  3. python 大小写字母怎么用数字表示_python判断字符串是字母 数字 大小写(转载)...
  4. GPD MicroPC 安装 Win10+Ubuntu 双系统
  5. 皮亚诺的数概念起点和算术公理1-2告诉我们什么?—— 皮亚诺读后之四
  6. latex图片的子标题放在中间
  7. 计算机基础与知识点总结,计算机基础知识点总结
  8. android ibeacon模拟器,未使用信标模拟器检测到iBeacon
  9. day15_css补充、js基础、dom基础
  10. C3 linearization