Java反射05:修飾子Modifierスタティックメソッド学習例


スーパーチャネル:Java汎用学習シリーズ-緒論
JAva.lang.reflect.Modifierクラスは、修飾子(public、private、staticなどのキーワード)を取得および変換するための静的メソッドを提供します.
1.Modifierで何ができるか
Modifierでは次のことができます.
  • Java修飾子毎に対応するint値
  • を取得できる.
  • はint値を対応するJava修飾子
  • に変換することができる.
  • は、あるint値が修飾子
  • に変換できるか否かを判断することができる.
  • は、全てのインターフェースの修飾子
  • を取得することができる.
  • はすべてのクラス(Class)の修飾子
  • を取得することができる.
  • は、すべてのコンストラクタの修飾子
  • を取得することができる.
  • は、すべてのフィールド(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) + "
    "
    ); // 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) + "
    "
    ); // 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()) + "
    "
    ); // 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) + "
    "
    ); // ( :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)
    10進数値は、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. xxx Modifiers()によって、関連するタイプによって許容される修飾子を取得することができる.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により、ある修飾子に対応する10進数値を取得できます.このうちXXXXXが取るべき値は12種類あり、PUBLIC、PRIVATE、PROTECTED、STATIC、FINAL、SYNCRONIZED、VOLATILE、TRANSIENT、NATIVE、INTERFACE、ABSTRACT、STRICTである.
    実行の結果、Java修飾子に対応する10進数と16進数の値については、次の表にまとめることができます.
    シーケンス番号
    修飾子
    Modifier対応フィールド
    じっしんち
    16進数
    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
    分析:
    各修飾子は16進数に変換できます
    各修飾子の10進数値は倍数関係です
    これらの修飾子の値は、517が1+4+512にしか分解できない、すなわちpublic protected interface同理、Modifier.constructorModifiers()=7、7が1+2+4にしか分解できない、すなわちpublic protected private
    5.まとめ
  • Modifier.FIELDでは、Java修飾子ごとに対応する10進数値と16進数値
  • を取得できます.
  • Modifier.toString(modifier)によりint値を対応するJava修飾子
  • に変換できる.
  • Modifier.isZzzz(modifier)[Zzzz=すべての修飾子]により、あるint値が1つの修飾子
  • に変換できるか否かを判断することができる.
  • Modifier.interfaceModifiers()によってすべてのインタフェース(interface)の修飾子
  • を取得することができる.
  • Modifier.classModifiers()によってすべてのクラス(Class)の修飾子
  • を取得することができる.
  • Modifier.constructorの修飾子
  • は、Modifier.constructorModifiers()によって取得することができる.
  • Modifier.fieldModifiers()を使用して、すべてのフィールド(Field)の修飾子
  • を取得できます.
  • Modifier.methodModifiers()によってすべてのメソッド(Method)の修飾子
  • を取得することができる.