JAva反射浅析(二)Methodメソッドテストについて
3695 ワード
前回のブログでは、反射全体のメカニズムを大まかに理解しました.
今回は、反射をよりよく理解するために、反射のいくつかの方法についてテストします.
1.首相は普通のクラスを設立した:このクラスにはいくつかの私有的な方法と属性が含まれている.
このクラスは熟知しています:x,yメソッド:add,bdd,cdd(クラスで宣言され、bdd,cddはプライベートメソッドです)
2.テストクラスTestを作成し、Tankクラスの情報にアクセスする.
テスト結果:
テストクラスを通して
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権限範囲チェックを抑制します.
今回は、反射をよりよく理解するために、反射のいくつかの方法についてテストします.
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権限範囲チェックを抑制します.