Java反射05:修飾子Modifierスタティックメソッド学習例
24305 ワード
スーパーチャネル:Java汎用学習シリーズ-緒論
JAva.lang.reflect.Modifierクラスは、修飾子(public、private、staticなどのキーワード)を取得および変換するための静的メソッドを提供します.
1.Modifierで何ができるか
Modifierでは次のことができます. Java修飾子毎に対応するint値 を取得できる.はint値を対応するJava修飾子 に変換することができる.は、あるint値が修飾子 に変換できるか否かを判断することができる.は、全てのインターフェースの修飾子 を取得することができる.はすべてのクラス(Class)の修飾子 を取得することができる.は、すべてのコンストラクタの修飾子 を取得することができる.は、すべてのフィールド(Field)の修飾子 を取得することができる.は、全ての方法(Method)の修飾子 を取得することができる.
2.コード例
3.運転結果
4.静的方法分析
インスタンス・コードと実行結果を組み合わせて、次のようにまとめます.
4.1.Modifier.toString(mod)
10進数値は、Modifier.toString(mod)によって修飾子キーに変換されます.次のようになります.
4.2.Modifier.isXxxx(mod)
Modifier.isXxxx(mod)によって、十進法値が何らかの修飾子であるかどうかを判断します.
4.3.Modifier.xxxModifiers()
各タイプで許可されている修飾子は次の表に示されています.
シーケンス番号
を選択します.
修飾子
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)の修飾子 を取得することができる.
JAva.lang.reflect.Modifierクラスは、修飾子(public、private、staticなどのキーワード)を取得および変換するための静的メソッドを提供します.
1.Modifierで何ができるか
Modifierでは次のことができます.
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.まとめ