getMethods

2979 ワード

以前overrideとoverloadの違いを見たことがあるので、正面から理解するのは簡単ですが、最近reflectを見てからも別の考え方で理解できるようになったので、もっと徹底的に理解できるかもしれません.
まずブログを引用します.
getDeclaredMethod*()は、public、protected、privateメソッドを含むクラス自身が宣言するすべてのメソッドを取得します.getMethod*()は、クラスのすべての共有メソッドを取得します.これには、自身のすべてのpublicメソッドと、ベースクラスから継承され、インタフェースから実装されるすべてのpublicメソッドが含まれます.親がpublicではないメソッドを取得するには、親に再帰してgetDeclaredMethod*()をgetDeclaredMethod*()するしかありません.invoke親のプライベートまたは一般的な(publicではない)メソッドの場合はmethodを設定する必要があります.setAccessible(true).

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

public class cl {
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		cl c=new cl();
		try {
		
		//c.getClass().getMethod("prt", a.class).invoke(c, new a());
//		Method[] mm=	c.getClass().getMethods();// 11 
//		length   :11
//		name prt
//		name main
//		name wait
//		name wait
//		name wait
//		name hashCode
//		name getClass
//		name equals
//		name toString
//		name notify
//		name notifyAll

		Method[] mm=	c.getClass().getDeclaredMethods();// , 3 
//		length   :3
//		name prt
//		name main
//		name p

		System.out.println("length   :"+mm.length);
		for(Method m1:mm){
		String sss=	m1.getName();
		System.out.println("name "+sss.toString());
		}
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
	public void prt(a s){
		s.p();
	}
	private void p(){
		
	}
}


次にinvock()について説明します.

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

public class cl {
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		cl c=new cl();
		try {
		
		try {
			c.getClass().getMethod("prt", a.class).invoke(c, new a());
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
	public void prt(a s){// a 
		s.p();
	}
	private void p(){
		
	}
}

最初のパラメータはメソッド名prtで、
c.getClass().getMethod("prt", a.class).invoke(c, new a());
prtはcの共有方法でなければなりません
2番目のパラメータは、メソッドに入力されたパラメータclass[]の集合であり、cはメソッドを呼び出すインスタンスを指し、new a()はメソッドの特定のパラメータ値を指す.
ここで説明する必要があるのは、8つの基本タイプclass[]もパッケージタイプの集合であり、publicメソッドでなければ呼び出しに異常があることです.
説明:overloadのパラメータはなぜタイプが違うのか、ここでclass[]が見えるのか、タイプが同じでも上書きできるのであれば、ここでclassは同じで、プログラムは実際にどれを実行するか分かりません.