java反射學(xué)習(xí)

上期作業(yè):

單向鏈表的刪除如圖所示

單向鏈表刪除.png

但在隊(duì)列中,是在頭部或在尾部插入數(shù)據(jù),往后或往前交換數(shù)據(jù)的方式達(dá)到目的,看需求而定。

反射的概念:
在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制。

反射機(jī)制的作用:
在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;
在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;
生成動(dòng)態(tài)代理 ????

反射機(jī)制中的類:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

實(shí)例化class類對(duì)象,3種方法
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;
class1 = Class.forName("StorageManager");
class2 = new StorageManager().getClass();
class3 = StorageManager.class;
打印。。。。。。

三、Java反射機(jī)制的調(diào)用:
1、獲取類對(duì)象:
Class<?> clazz = Class.forName("包名.類名");
2、獲取類的父類:
Class<?> parentClass = clazz.getSuperclass();
3、獲取類實(shí)現(xiàn)的接口:
Class<?> intes[] = clazz.getInterfaces();
4、實(shí)例化對(duì)象:
實(shí)例化默認(rèn)構(gòu)造方法,可調(diào)用set、get賦值、取值
User user = (User) clazz.newInstance();
5、獲取所有的構(gòu)造方法:可使用構(gòu)造函數(shù)賦值
Constructor<?> cons[] = clazz.getConstructors();
6、獲取構(gòu)造方法所需要的參數(shù):
Class<?> clazzs[] = cons[i].getParameterTypes();
7、獲取類的全部屬性:
Field[] field = clazz.getDeclaredFields();
8、獲取類屬性的權(quán)限修飾符:
int mo = field[i].getModifiers();
String priv = Modifier.toString(mo);
9、獲取類屬性的類型:
Class<?> type = field[i].getType();
10、獲取類的全部方法:
Method method[] = clazz.getMethods();
11、獲取方法的返回值類型:
Class<?> returnType = method[i].getReturnType();
12、獲取方法的參數(shù)類型:
Class<?> para[] = method[i].getParameterTypes();
13、獲得構(gòu)造方法聲明的異常:
Class<?> exce[] = method[i].getExceptionTypes();

14、反射調(diào)用類的方法:
1、無參
Method method = clazz.getMethod("方法1");
method.invoke(clazz.newInstance());
2、有參
method = clazz.getMethod("方法2", int.class, String.class);
method.invoke(clazz.newInstance(), 20, "張三");

15、反射調(diào)用類的屬性:
Object obj = clazz.newInstance();
// 可以直接對(duì) private 的屬性賦值
Field field = clazz.getDeclaredField("proprety");
field.setAccessible(true);
field.set(obj, "修改屬性");

備注:以上的調(diào)用當(dāng)然也可以獲取父類的

16、反射機(jī)制的動(dòng)態(tài)代理:
定義一個(gè)InvocationHandler接口的子類,已完成代理的具體操作,實(shí)現(xiàn)以下方法。
public Object bind(Object obj) {
this.obj = obj;
//注意下面這句
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), this);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容