JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機(jī)制。
通過Java的反射機(jī)制可以獲取以下內(nèi)容:
Class對象
可以直接通過類.class獲取。
例如獲取String的class對象
Class cls = String.class;
也可以通過類名進(jìn)行獲取
Class cls = Class.forName("java.lang.String");
類名
可以通過class對象的getName()方法獲取類名,getSimpleName()獲取不帶包名的類名
//帶包類名
String name = cls.getName();
//不帶包名的類名
String simpleName = cls.getSimpleName();
方法
Method[] methods = cls.getMethods();
getMethods()可以獲取到該類中所有的public方法
也可以獲取到單個方法
Method method = cls.getMethod("method",new Class[]{String.class});
第一個參數(shù)是方法的名字,第二個參數(shù)是方法的參數(shù),這里是以只有一個string類型的參數(shù)為例。如果沒有參數(shù)傳入null即可
如果已經(jīng)知道方法,也可以獲取到方法的參數(shù)
Class[] parameterTypes = method.getParameterTypes();
當(dāng)然也可以返回方法的返回類型
Class returnType = method.getReturnType();
可以通過invoke()方法來調(diào)用方法需要傳2個參數(shù),第一個參數(shù)是調(diào)用方法的對象,如果是靜態(tài)方法可以傳入null第二個參數(shù)是方法需要的參數(shù)列表
Object returnValue = method.invoke(null, "parameter");
構(gòu)造方法
構(gòu)造方法和普通方法類似
Constructor[] constructors = cls.getConstructors();
Constructor constructor = cls.getConstructor(new Class[]{String.class});
Class[] parameterTypes = constructor.getParameterTypes();
可以使用constructor的newInstance()方法實(shí)例一個對象
String str = (String) constructor.newInstance("test");
屬性
Field[] fields = cls.getFields();
Field field = cls.getField("name");
可以通過getFields()方法獲取所有的public屬性,getField()獲取指定的方法,當(dāng)然也只能獲取public的屬性。
在反射中也可以獲取private的屬性和方法以下分別進(jìn)行演示
包
Package pack = cls.getPackage();
父類
java是單繼承最多一個父類
Class supercls = cls.getSuperclass();
實(shí)現(xiàn)的接口
一個類可以實(shí)現(xiàn)多個接口
Class[] interfaces = cls.getInterfaces();
這里只會返回該類實(shí)現(xiàn)的接口,而不會返回父類實(shí)現(xiàn)的接口
文章參考
https://baike.baidu.com/item/JAVA%E5%8F%8D%E5%B0%84%E6%9C%BA%E5%88%B6/6015990?fr=aladdin
http://www.itdecent.cn/p/2315dda64ad2