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.代码示例

/**
 * <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) = 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

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

序号类型修饰符
1interfacepublic protected private abstract static strictfp
2classpublic protected private abstract static final strictfp
3constructorpublic protected private
4fieldpublic protected private static final transient volatile
5methodpublic 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对应字段十进制值十六进制值
1publicModifier.PUBLIC10x00000001
2privateModifier.PRIVATE20x00000002
3protectedModifier.PROTECTED40x00000004
4staticModifier.STATIC80x00000008
5finalModifier.FINAL160x00000010
6synchronizedModifier.SYNCHRONIZED320x00000020
7volatileModifier.VOLATILE640x00000040
8transientModifier.TRANSIENT1280x00000080
9nativeModifier.NATIVE2560x00000100
10interfaceModifier.INTERFACE5120x00000200
11abstractModifier.ABSTRACT10240x00000400
12strictModifier.STRICT20480x00000800

通过分析:

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

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

通过多个修饰符的和值可以反推出这些修饰符的值
如:
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)的修饰符
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值