JAVA學習日記:反射機制(3)

2020-10-07 16:03:37

反射機制學習日記(3)

今天是第三課:

Method類中的方法的使用(含程式碼和註釋):

getMethods()獲得本類及父類別中的public許可權修飾**符方法
getDeclaredMethods()專門獲得呼叫該方法的物件的本類中的所有方法包括private許可權修飾符**的方法
getDeclaredMethod(String name,class<?>...parameterTypes)
第一個引數:方法的名稱
第二個引數:可變長度,寫你要查詢的那個方法的引數型別列表.class
getParameterCount()得到方法的引數個數
package LessonForReflection03;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

abstract class Card
{
	private void creatRandomNumbers(int count)//private關鍵字
	{
		
	}
	
	public void getFullCardsNumbers(String[] random, String pre_numbers)
	{
		
	}
	
	public static void getUserInfor()
	{
		
	}
	
	public abstract void getUserInfor(String tel);
	
	public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;

}

public class MethodInforGetter 
{

	public static void main(String[] args) 
	{
			Class<?> c1 = Card.class;

			System.out.println("-------------------------");
			
			Method[] m1 = c1.getMethods();//getMethods()獲得本類及父類別中的public方法!
			for (Method m:m1)
			{
				System.out.println(m);
			}
			
			System.out.println("-------------------------");
			
			Method[] m2 = c1.getDeclaredMethods();//getDeclaredMethods()專門獲得本類中的所有方法包括private!
			for (Method m:m2)
			{
				System.out.println(m);
			}
			
			System.out.println("-------------------------");
			
			/*
			 *	getDeclaredMethod(String name,class<?>...parameterTypes)
			 *	第一個引數:方法的名稱
			 *	第二個引數:可變長度,寫你要查詢的那個方法的引數型別列表
			 * 
			 * 	getParameterCount()得到方法的引數個數
			 */
			
			try 
			{
				Method m3 = c1.getDeclaredMethod("getUserInfor");
				System.out.println(m3);
				
				//getParameterCount()方法,獲得方法引數個數
				System.out.println(m3.getParameterCount());
				System.out.println(Modifier.toString(m3.getModifiers()));//獲得方法修飾符
				System.out.println(m3.getReturnType());
				
				System.out.println("-------------------------");
				
				Method m4 = c1.getDeclaredMethod("getUserInfor", int.class,int.class);
				
				//getExceptionTypes()可以獲得初始化當前Method物件的給Class物件初始化的那個類的那個指定方法丟擲的異常型別
				Class<?>[] exception = m4.getExceptionTypes();
				for (Class<?> e:exception)
				{
					System.out.println(e);
				}
				
			} catch (NoSuchMethodException | SecurityException e) 
				{
					e.printStackTrace();
				}
	}
}

Constructor類中的方法的使用(含程式碼和註釋):

java.lang.reflect.Constructor:
	Constructor[] getConstructor()獲得本類裡的public許可權修飾符建構函式,不能獲取父類別的!
	Constructor[] getDeclaredConstructor()獲得本類中的所以建構函式!
	Constructor<T> getConstructor(Class...parameterType)用引數決定獲得本類中的某個的構造方法,只能獲得public的
	Constructor<T> getDeclaredConstructor(Class...parameterType)用引數決定獲得本類中的某個構造方法
	附:
		JDK8.0之後新增的類:
			Executable:
					它是Method和Constructor的父類別
					常用方法:
							getParameter()獲得類中方法引數
							getExceptionTypes()獲得類中某個方法丟擲異常型別
							getMoidfiers()獲得方法許可權修飾符
			 Parameter:
			 		  封裝並代表了引數範例
package LessonForReflection03;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

/*
 * java.lang.reflect.Constructor
 * 
 * 	Constructor[] getConstructor();獲得本類裡的public許可權修飾符建構函式,不能獲取父類別的
 *  Constructor[] getDeclaredConstructor();得本類裡的全部構造
 *  
 *  Constructor<T> getConstructor(Class...parameterType);用引數決定獲得哪個構造方法
 *  Constructor<T> getDeclaredConstructor(Class...parameterType); 
 * 
 */

public class ConstructorInforGetter 
{
	public static void main(String[] args) 
	{
		System.out.println("獲得Cricle本類裡的public許可權修飾符建構函式,不能獲取父類別的Constructor[] getConstructor()");
		System.out.println("子類繼承不了父類別中的構造方法和private");
		//Constructor[] getConstructor()獲得Cricle本類裡的public許可權修飾符建構函式,不能獲取父類別的
		//子類繼承不了父類別中的構造方法和private
		Class<Circle> c1 = Circle.class;
		Constructor<?>[] cons1 = c1.getConstructors();
		for (Constructor<?> cons:cons1)
		{
			System.out.println(cons);
			//System.out.println(cons.getName());
		}
		
		System.out.println("-----------------------");
		
		System.out.println("方法獲得本類中的所有建構函式getDeclaredConstructor()");
		Constructor<?>[] cons2 = c1.getDeclaredConstructors();
		for (Constructor<?> cons:cons2)
		{
			System.out.println(cons);
		}
		
		System.out.println("-----------------------");
		
		try 
		{
			System.out.println("方法用引數指定獲得本類!構造方法,只能獲取public的Constructor<T> getConstructor(Class...parameterType)");
			Constructor<?> cons3 = c1.getConstructor(int.class);
			System.out.println(Modifier.toString(cons3.getModifiers()));
			System.out.println(cons3);
			
			System.out.println("-----------------------");
			
			System.out.println("方法用引數指定獲得本類!構造方法任何許可權修飾符的都可以獲得Constructor<T> getDeclaredConstructor(Class...parameterType)");
			Constructor<?> cons4 = c1.getDeclaredConstructor(String.class);
			System.out.println(cons4);
			
			System.out.println("-----------------------");
			
			/*
			 * JDK8.0之後新增的類
			 * 	Executable:
			 * 		是Method和Constructor的父類別
			 * 		方法:
			 * 			getParameter();
			 * 			getExceptionTypes();
			 * 			getModifiers();
			 *          getTypeParameters();
			 *  
			 *  Parameter:
			 *  	封裝並代表了引數範例
			 */
			System.out.println("獲取類中方法的引數getParameters()");
			Constructor<?> cons5 = c1.getDeclaredConstructor(int.class,String.class);
			Parameter[] p1 = cons5.getParameters();
			for (Parameter p:p1)
			{
				System.out.println(p);
			}
		} catch (NoSuchMethodException | SecurityException e) 
			{
				e.printStackTrace();
			}
		
	}

}

程式碼中提到的Circle類和Shape類二者為繼承關係:

package LessonForReflection03;

public class Circle extends Shape
{
	private int r;
	private String color;

	public Circle(int r, String color) 
	{
		super();
		this.r = r;
		this.color = color;
	}
	
	public Circle(int r) 
	{
		super();
		this.r = r;
	}

	protected Circle(String color) 
	{
		super();
		this.color = color;
	}

	 Circle()
	{
		super();
	}
}
package LessonForReflection03;

public class Shape 
{
	private int per;

	public Shape(int per) 
	{
		super();
		this.per = per;
	}

	public Shape() 
	{
		super();
	}
}

部分文字來源於:
咕嘟咖啡楊海濱老師 — 《java程式語言高階特性》
輕量化研習Java相關技術倡導者
「愛碼學院」聯合創始人自適應教學理念提出者踐行者;多年開發及專案管理經歷;出版《JavaEE企業級應用與開發》一書;10餘年高校專案實踐畢設指導經驗;企業軟培經驗豐富。