通過(guò)反射創(chuàng)建一個(gè)對(duì)象(三步)
第一步:獲取類(lèi)的信息
參數(shù):包名+類(lèi)名
Class class = Class.forName("com.javawu.reflect.Demo");
第二步:獲取類(lèi)的構(gòu)造方法
參數(shù):構(gòu)造方法需要傳遞的參數(shù)的Class
Constructor constructor = class.getConstructor(String.class, int.class);
第三步:根據(jù)獲取到的構(gòu)造方法傳遞相應(yīng)的參數(shù)創(chuàng)建對(duì)象
Demo demo = (Demo)constructor.newInstance("張三", 55);
反射機(jī)制是什么
反射機(jī)制是在運(yùn)行狀態(tài)中噩峦,對(duì)于任意一個(gè)類(lèi)秽梅,能夠知道這個(gè)類(lèi)的所有屬性和方法剪勿,對(duì)于任意一個(gè)對(duì)象李皇,能夠調(diào)用它的任意一個(gè)方法和屬性蝙斜。
這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的放射機(jī)制抛猫。
反射機(jī)制能做什么
- 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
- 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
- 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法
- 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
- 生成動(dòng)態(tài)代理
獲取類(lèi)的類(lèi)信息
//參數(shù)需要帶上類(lèi)所在的包名
Class class = Class.forName("com.javawu.reflect.Person");
獲取類(lèi)中的所有公有構(gòu)造方法
Constructor[] constructors = class.getConstructors();
獲取類(lèi)中的所有的共有的和私有的構(gòu)造方法
constructors = class.getDeclaredConstructors();
獲取某個(gè)構(gòu)造方法
- 獲取不帶參的構(gòu)造方法
Constructor constructor = class.getConstructor();
- 獲取參數(shù)為String和int類(lèi)型的構(gòu)造方法
constructor = class.getConstructor(String.class, int.class);
//傳遞數(shù)組參數(shù)
//Class[] params = {String.class, int.class};
//class.getConstructor(params);
- 當(dāng)構(gòu)造方法為private時(shí)驰怎,需要設(shè)置訪問(wèn)權(quán)限
constructor.setAccessible(true);
- 根據(jù)構(gòu)造方法創(chuàng)建該類(lèi)的對(duì)象
person = (Person)constructor.newInstance("參數(shù)");
獲取構(gòu)造方法名
constructor.getName();
獲取構(gòu)造方法的參數(shù)的Class數(shù)組
Class[] params = constructor.getParemeterTypes();
獲取類(lèi)中的所有public方法(包括父類(lèi)的方法)
Method[] methods = class.getMethods();
獲取類(lèi)中所有的方法(不包括父類(lèi)的方法)
methods = class.getDeclaredMethods();
獲取指定方法名和參數(shù)的方法
//第一個(gè)參數(shù):方法的名字 第二個(gè)參數(shù):方法的參數(shù)的Class
Method method = class.getMethod("eat", null);
調(diào)用方法
Person person = new Person();
//第一個(gè)參數(shù):執(zhí)行方法的對(duì)象 第二個(gè)參數(shù):方法的參數(shù)
method.invoke(person, null);
調(diào)用靜態(tài)方法
method.invoke(null, 參數(shù))
獲取類(lèi)中的所有public屬性
Field[] fields = class.getFields();
獲取類(lèi)中的所有屬性
fields = class.getDeclaredFields();
獲取指定屬性名的屬性
Field field = calss.getField("name");