反射機制學習日記(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余年高校專案實踐畢設指導經驗;企業軟培經驗豐富,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/161101.html
標籤:其他
上一篇:Java日常學習之集合
下一篇:單向鏈表
