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

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

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

1.通过Modifier可以做什么

通过Modifier可以做以下事情:

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

2.代码示例

/**
 * 

java.lang.reflect.Modifier示例

* * @author hanchao 2018/2/27 21:19 **/
public class ReflectModifierDemo { private static final Logger LOGGER = Logger.getLogger(ReflectModifierDemo.class); /** *

java反射-修饰符 示例

* * @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) = private

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

2018-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 strictfp

2018-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 = 0x00000800

2018-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反射,Java反射学习实例)