超级通道: Java泛型学习系列-绪论
java.lang.reflect.Modifier类提供了用于获取和转换修饰符(即public,private,static等等的关键字)的静态方法。
通过Modifier可以做以下事情:
/**
* 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()));
}
}
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
结合实例代码与运行结果,进行以下总结:
通过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
通过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
通过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 |
通过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