JAva反射機構の詳細とMethod.invoke解釈

4216 ワード

JAVA反射機構
JAVA反射機構は運転状態において、いずれのクラスに対しても、このクラスのすべての属性と方法を知ることができる.任意のオブジェクトに対して、その任意のメソッドを呼び出すことができます.このような動的に取得された情報および動的にオブジェクトを呼び出す方法の機能をjava言語の反射メカニズムと呼ぶ.Java反射メカニズムは主に以下の機能を提供している:実行時に任意のオブジェクトが属するクラスを判断する;実行時に任意のクラスのオブジェクトを構築します.実行時に任意のクラスが持つメンバー変数と方法を判断する.実行時に任意のオブジェクトを呼び出す方法.動的エージェントを生成します.1.オブジェクトのプロパティを取得する
public Object getProperty(Object owner, String fieldName) throws Exception {
     Class ownerClass = owner.getClass();
 
     Field field = ownerClass.getField(fieldName);
 
     Object property = field.get(owner);
 
     return property;
}

 Class ownerClass = owner.getClass():オブジェクトのClassを取得します.Field field = ownerClass.getField(fieldName):クラス宣言のプロパティをClassで取得します.Object property = field.get(owner):オブジェクトによってその属性のインスタンスが得られ、この属性が非公開の場合、IllegalAccessExceptionが報告されます.2.あるクラスの静的属性を得る
public Object getStaticProperty(String className, String fieldName)
             throws Exception {
     Class ownerClass = Class.forName(className);
 
     Field field = ownerClass.getField(fieldName);
 
     Object property = field.get(ownerClass);
 
     return property;
}

 Class ownerClass = Class.forName(className):まずこのクラスのClassを入手します.Field field = ownerClass.getField(fieldName):クラス宣言のプロパティは、上記と同様にClassによって取得されます.Object property = field.get(ownerClass):この属性は静的なので、クラスのClassから直接取ります.3.あるオブジェクトを実行する方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
 
     Class ownerClass = owner.getClass();
 
     Class[] argsClass = new Class[args.length];
 
     for (int i = 0, j = args.length; i < j; i++) {
         argsClass[i] = args[i].getClass();
     }

      Method method = ownerClass.getMethod(methodName,argsClass);
 
     return method.invoke(owner, args);
}

 Class owner_class = owner.getClass():まずこのオブジェクトのClassを取得しなければなりません.5~9行:パラメータのClass配列を設定し、Methodを探す条件とする.Method method = ownerClass.getMethodName(methodName,argsClass):methodNameとパラメータのargsClass(メソッド内のパラメータタイプの集合)配列から実行するMethodを取得します.method.invoke(owner,args):このMethodを実行します.invokeメソッドのパラメータは、このメソッドを実行するオブジェクトownerと、パラメータ配列argsであり、ownerオブジェクトにパラメータargsを持つmethodメソッドであることが理解できる.戻り値はObjectであり,このメソッドの戻り値でもある.4.あるクラスの静的メソッドを実行する
public Object invokeStaticMethod(String className, String methodName,
             Object[] args) throws Exception {
     Class ownerClass = Class.forName(className);
 
     Class[] argsClass = new Class[args.length];
 
     for (int i = 0, j = args.length; i < j; i++) {
         argsClass[i] = args[i].getClass();
     }
 
    Method method = ownerClass.getMethod(methodName,argsClass);
 
     return method.invoke(null, args);
 }

基本的な原理は、インスタンス3と同様であり、異なる点は最後の行であり、invokeのパラメータはnullである.これは静的メソッドであり、インスタンスを用いて実行する必要がないからである.5.新規インスタンス
public Object newInstance(String className, Object[] args) throws Exception {
     Class newoneClass = Class.forName(className);
 
     Class[] argsClass = new Class[args.length];
 
     for (int i = 0, j = args.length; i < j; i++) {
         argsClass[i] = args[i].getClass();
     }
 
     Constructor cons = newoneClass.getConstructor(argsClass);
 
     return cons.newInstance(args);
 
}

ここでいう方法は,パラメータ付き構造関数を実行してインスタンスを新規作成する方法である.パラメータが必要ない場合はnewoneClassを直接使用できます.新Instance()で実現します.Class newoneClass = Class.forName(className):最初のステップでは、構築するインスタンスのClassを取得します.5~9行目:パラメータのClass配列を得る.Constructor cons = newoneClass.getConstructor(argsClass):構造子を取得します.cons.新Instance(args):新規インスタンス.6.クラスのインスタンスかどうかを判断する
public boolean isInstance(Object obj, Class cls) {
     return cls.isInstance(obj);
}

 7.配列内の要素を取得
public Object getByArray(Object array, int index) {
     return Array.get(array,index);
}