上期作業(yè):
單向鏈表的刪除如圖所示

但在隊(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);
}