Java基礎--反射Reflect----Method

    Method 提供關於類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法多是類方法或實例方法(包括抽象方法)。Java反射中獲取Method方法以下:

   a、public Method[] getDeclaredMethods()  只獲取本類全部的方法,包括private、protected、default、public 訪問權限;不包括繼承過來的方法;
   b、public Method[] getMethods()  獲取該類的public訪問權限的方法  包括繼承的父類的public方法
public class ParentClass {
    
	private String testParPriv(String value){
		return value;
	}
	public String  testParPub(String value){
		return value;
	}
	protected String testParPro(String value){
		return value;
	}
	String testParDef(String value){
		return value;
	}
	private static String testStaticParPrive(String value){
		return value;
	}
	public static String testStaticParPub(String value){
		return value;
	}
}

 

public class SubClass extends ParentClass {
	
	private String testPriv(String value){
		return value;
	}
	public String  testPub(String value){
		return value;
	}
	public String testPub(String value,String value1){
		return value1;
	}
	protected String testPro(String value){
		return value;
	}
	String testDef(String value){
		return value;
	}
	private static String testStaticPriv(String value){
		return value;
	}
	
	public static void main(String[] args) {
		try {
		    Class<?> clz = SubClass.class;
		    SubClass sub = new SubClass();
		   
		    Method[] methods =  clz.getDeclaredMethods();
		    for (Method method : methods) {
				System.out.println(method.toGenericString());
		     }
		      System.out.println("---------------------------------------------");
		    Method[] publicMethods = clz.getMethods();
		    for (Method method : publicMethods) {
				System.out.println(method.toGenericString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

 運行結果: html

public static void cn.trip.core.servlet.SubClass.main(java.lang.String[])
private static java.lang.String cn.trip.core.servlet.SubClass.testStaticPriv(java.lang.String)
private java.lang.String cn.trip.core.servlet.SubClass.testPriv(java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String)
protected java.lang.String cn.trip.core.servlet.SubClass.testPro(java.lang.String)
java.lang.String cn.trip.core.servlet.SubClass.testDef(java.lang.String)
---------------------------------------------
public static void cn.trip.core.servlet.SubClass.main(java.lang.String[])
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String)
public static java.lang.String cn.trip.core.servlet.ParentClass.testStaticParPub(java.lang.String)
public java.lang.String cn.trip.core.servlet.ParentClass.testParPub(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class<?> java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
   c、public Method getDeclaredMethod(String name,  Class<?>... parameterTypes) 獲取本類中方法名稱爲name,形參類型爲parameterTypes的方法;
   d、public Method getMethod(String name,  Class<?>... parameterTypes) 獲取本類或者父類中方法名稱爲name,形參類型爲parameterTypes的public方法;
      因爲Java中容許方法重載,所以一個類中能夠有多個方法名稱相同,可是參數不一樣的方法;Class<?... parameterTypes表示這個方法能夠沒有形參,能夠由一個或多個;

Method類中部分方法:java

  一、public Class<?> getReturnType()  獲取方法返回值類型安全

  二、public Class<?> getDeclaringClass() 獲取定義該方法的類spa

  三、public Object getDefaultValue()   獲取該方法的默認返回值-----只對註解類中的方法有效code

  四、public Type[] getExceptionTypes() 獲取該方法拋出的異常類型orm

  五、public Class<?>[] getParameterTypes() 獲取該方法的形參參數類型htm

public class SubClass  {

	public String testPub(String value, String value1) {
		return value1;
	}

	public static void main(String[] args) {
		try {
			Class<?> clz = SubClass.class;
			Method method = clz.getMethod("testPub", String.class, String.class);
			System.out.println(method.toGenericString());

			Class<?> returnType = method.getReturnType();
			System.out.println("方法返回值類型" + returnType.getCanonicalName());
			Class<?> declareClass = method.getDeclaringClass();
			System.out.println("該方法是哪一個類定義的" + declareClass.getCanonicalName());
			Object defalutValue = method.getDefaultValue();
			System.out.println("方法返回默認值(只對註解類中方法有效)" + defalutValue);
			Class<?> throwException[] = method.getExceptionTypes();
			for (Class<?> class1 : throwException) {
				System.out.println("方法拋出的異常" + class1.getCanonicalName());
			}
			Class<?>[] parameters = method.getParameterTypes();
			for (Class<?> class1 : parameters) {
				System.out.println("方法形參類型" + class1.getCanonicalName());
			}
			boolean isAccessible = method.isAccessible();
			System.out.println("是否進行安全檢查" + isAccessible);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  運行結果:  繼承

public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
方法返回值類型java.lang.String
該方法是哪一個類定義的cn.trip.core.servlet.SubClass
方法返回默認值(只對註解類中方法有效)null
方法形參類型java.lang.String
方法形參類型java.lang.String
是否進行安全檢查false
  六、public Object invoke(Object obj, Object... args)  定義該方法的類的實例 obj調用該方法,形參參數爲  ... args ;   
public static void main(String[] args) {
		try {
			Class<?> clz = SubClass.class;
			SubClass sub = new SubClass();
			Method method = clz.getMethod("testPub", String.class, String.class);
			System.out.println(method.getName());
                         Object returnValue = method.invoke(sub, "A","B");
                         System.out.println("調用方法後返回值"+returnValue);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
testPub
調用方法後返回值B

  七、public Annotation[] getDeclaredAnnotations() 返回該方法上的全部註解接口

  八、public <T extends Annotation> T getAnnotation(Class<T> annotationClass)  獲取該方法上的annotationClass類型註解ip

相關文章
相關標籤/搜索