今天是第三課:
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餘年高校專案實踐畢設指導經驗;企業軟培經驗豐富。