Java反射法2:クラスメンバー(Class Members)

4229 ワード

一、クラスのメンバーとは何ですか。


Java反射は、実行時にクラスのメンバーを取得できることはよく知られています.では、問題が来ました.クラスのメンバーとは何ですか.Java 7の公式解釈を見てみましょう.
According to The Java Language Specification, Java SE 7 Edition, the members of a class are the inherited components of the class body including fields, methods, nested classes, interfaces, and enumerated types. Since constructors are not inherited, they are not members. This differs from the implementing classes of java.lang.reflect.Member.
以上の情報は以下のように理解できます.
クラスのメンバーには、親から継承されたメンバー変数、メソッドが含まれます.埋め込まれたクラス、インタフェース、列挙タイプ.コンストラクションメソッドは継承できないため、クラスメンバーではありません.

二、メンバー変数(field)


1.メンバー変数の取得


まず,ペアClassAPIでメンバ変数を取得する方法のまとめを見る.
Class API
複数のメンバー変数をListで返す
親メンバー変数を返す
プライベートメンバー変数を返すgetDeclaredField()
no
no
yes getField()
no
yes
no getDeclaredFields()
yes
no
yes getFields()
yes
yes
no
クラスオブジェクトは、クラスのメンバー変数を取得するための4つの方法を提供し、そのうちgetDeclaredField()およびgetField()は、いずれも変数名を指定することによって単一のメンバー変数を取得する必要がある.getFields()およびgetDeclaredFields()複数のメンバー変数をチェーンで返すことができる.
Class c = ... //  Class 
Field field = c.getField("fieldName") //  
Field[] fields = c.getFields() //  , 

以上の表から,この4つの方法で親のプライベートメンバー変数を取得できないことが分かる.

2.メンバー変数の名前、タイプ、修飾子の取得


(1). 名前はFieldクラスField.getName()で変数名を取得
Field field = ... //  
String fieldName = field.getName();

(2). タイプFieldクラスField.getType()で変数タイプを取得
Class c = String.class; // String  
Field[] fields = c.getFields(); //  String 
Object fieldType = fields[0].getType(); //  

(3). 修飾器はFieldクラスのField.getModifiers()で変数タイプを取得する
Class c = String.class; // String  
Field[] fields = c.getFields(); //  String 
int modifier = fields[0].getModifiers(); //  
Modifier.toString(modifier); //  
Fieldクラスは、Field.isSynthetic()およびField.isEnumConstant()メソッドも提供している.前者は変数が合成されたか否かを決定し、後者は変数が列挙定数に属するか否かを決定する.

3.メンバー変数値の取得、メンバー変数への付与

Class c = MyObject.class;
Field field = c.getField("fieldName"); 

MyObject newInstance = new MyObject(); //  

Object value = field.get(newInstance); //  

field.set(newInstance, value); //  

三、方法(method)


まず,対ClassAPIで取得method経路のまとめを見る.
Class API
複数のメソッドをListで返す
親メソッドを返す
プライベートメソッドを返すgetDeclaredMethod()
no
no
yes getMethod()
no
yes
no getDeclaredMethods()
yes
no
yes getMethods()
yes
yes
no
取得方法(method)には同様に4つの方法があり,具体的な違いはメンバー変数の取得と同様であり,これ以上述べない.
注意:getMethod()およびgetDeclaredMethod()を使用する場合はパラメータのタイプを指定し、パラメータを持たない場合はnullを指定します.不思議なことに、パラメータの元の値(primitive)タイプの場合、int.classboolean.class・などをパラメータタイプとして直接使用することができます.
Class c = String.class;
Method method1 = c.getMethod("charAt", int.class); //  int 
Method method1 = c.getMethod("getBytes", new Class[]{String.class}); //  String 

String methodName = method1.getName(); //  

1.クラスメソッドのパラメータタイプと戻りタイプを取得する(ReturnType)

Method method = ... //  
Class[] parameterTypes = method.getParameterTypes(); // 
Class returnType = method.getReturnType(); //  

2.クラスメソッドを取得する修飾器

Method method = ... 
int modifier = method.getModifiers();

3.パラメータ数が確定しているか確認する

Method method = ... 
boolean varArgs = method.isVarArgs();

4.呼び出し方法(method)


通過Methodinvoke()呼び出し方法
Method method = String.class.getMethod("charAt", int.class);
Char returnValue = method.invoke("Hello", 4);

参考文献


Java Reflection - Tutorials Java Reflection - Fields Java Reflection - Methods