JAva反射浅析(二)Methodメソッドテストについて

3695 ワード

前回のブログでは、反射全体のメカニズムを大まかに理解しました.
今回は、反射をよりよく理解するために、反射のいくつかの方法についてテストします.
1.首相は普通のクラスを設立した:このクラスにはいくつかの私有的な方法と属性が含まれている.

public class Tank {
	
	private  int x = 4;
	public  int y = 5;
	
	public Tank(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
	public Tank(){
		
	}
	public int add(){
		
		return 4;
		
	}
	private void bdd(){
		
		System.out.println("   !!");
		
	}
	private  void cdd(int x,int y){
		
		System.out.println("  !!");
		
	}

}


このクラスは熟知しています:x,yメソッド:add,bdd,cdd(クラスで宣言され、bdd,cddはプライベートメソッドです)
2.テストクラスTestを作成し、Tankクラスの情報にアクセスする.

package ReflectJava;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

        Class t = Tank.class;      // Tank Class  
        Object o = t.newInstance();//  class  Tanke 
        
       //-------------------Method  ------------------------------
        
        Method[] methods = t.getDeclaredMethods();
     // getDeclaredMethods()  , , 
        
        Method[] methoods = t.getMethods();
       //getMethods()    
        System.out.println("------- getDeclaredMethods() ------------");
        for(Method s: methods){
        	
        	System.out.println(s.getName());
        	
        }
        System.out.println("------- getMethods() ------------");
        for(Method ss: methoods){
        	
        	
        	System.out.println(ss.getName());
        	
        }
         Method m1 = t.getDeclaredMethod("add");
         Method m2 = t.getMethod("bdd");
        
        // System.out.println(m2.invoke(o));
        System.out.println(m2.invoke(o));
        	
		//---------------------------------------------------------------
		
		

	}

}


テスト結果:
 

------- getDeclaredMethods() ------------
bdd
cdd
add
------- getMethods() ------------
add
hashCode
getClass
wait
wait
wait
equals
toString
notify
notifyAll

テストクラスを通して
getMethods,getDeclareMethods,getMethod,getDeclareMethodメソッドの違い:
//メソッド配列を返す
getMethods:クラスのすべてのメソッドを返しますが、プライベートメソッドは含まれません.
getDeclareMethods:プライベートメソッドを含むクラスのすべての表示宣言メソッドを返します.
//特定のメソッドを返す
getMethod:クラスの任意の公開メソッドを返します.
getDeclareMethod:クラスの表示宣言の公開、プライベートメソッドを返します.
まとめ:getDeclareMethodsのみがプライベートメソッドを返すことができます.
他は公有の方法に戻るしかない.
            
すなわち,明確なメソッドを返すには,getMethod(「メソッド名」,Class[]{....})などである.メソッド名は公有でなければなりません.そうしないと、プログラムの実行時にエラーが発生します.
メソッドパラメータの設定に関する質問:
public Method getMethod(String name,
                        Class... parameterTypes)
public int add(int x,int y)メソッドに反射する場合
対応するパラメータは次のように設定されます.
Method ss = getMethod("add",new
Class[]{int.class,int.class});
例えばクラスTank t=new Tank()
メソッドを呼び出す:ss.invoke(t,new Object[]{3,4});
注意:ssがプライベートメソッドの場合、ss.invokeメソッドが呼び出されると、実行時にエラーが発生します.
このときssを呼び出すべきである.setAccessible(true); jvm権限範囲チェックを抑制します.