反射笔记-----------------------------
1.反射基本概念:
?
01.定義:
反射是指在程序運(yùn)行期間,能夠觀察和修改類(lèi)或者類(lèi)的對(duì)象的屬性和行為的特性!
?
?
02.作用:
001.在運(yùn)行期間獲取類(lèi)的修飾符,包名,類(lèi)名,實(shí)現(xiàn)的接口,繼承的父類(lèi)。
002.在運(yùn)行期間獲取類(lèi)的所有屬性名,修飾符,屬性類(lèi)型。
003.在運(yùn)行期間獲取所有方法,方法的返回值類(lèi)型,方法名,方法參數(shù)數(shù)量,方法參數(shù)類(lèi)型。
004.在運(yùn)行期間加載類(lèi)的方法。
?
?
03.java反射API常用的類(lèi)
001.java.lang.Class
002.java.lang.reflect.Method
003.java.lang.Constructor
004.java.lang.Filed
005.java.lang.Modifier
2.例子
01.使用java反射獲取類(lèi)的信息
001.父類(lèi)代碼
package cn.pb.bean;/*** 父類(lèi)* * @author Administrator* */ public class FatherTest {private String teststr = "測(cè)試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}002.子類(lèi)代碼
package cn.pb.bean;/*** 測(cè)試類(lèi) 人類(lèi) 繼承了父類(lèi)*/ import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;}}003.測(cè)試類(lèi)代碼:
package cn.pb.test;/*** 測(cè)試類(lèi) 通過(guò)反射獲取類(lèi)的信息* * @author Administrator* */ public class GetClassInfo {public void test(String className) throws Exception {// 獲取Person類(lèi)對(duì)象 傳遞的className為類(lèi)的全類(lèi)名Class clazz = Class.forName(className);// 獲取類(lèi)在的包名 clazz.getSimpleName():獲取類(lèi)名Package pkg = clazz.getPackage();System.out.println(clazz.getSimpleName() + "定義在" + pkg.getName()+ "包中!");System.out.println("*********************");// 獲取此對(duì)象所表示的實(shí)體(類(lèi),接口,基本類(lèi)型或者void)的超類(lèi)Class// 如果此對(duì)象是一個(gè)Object類(lèi),一個(gè)接口,一個(gè)基本類(lèi)型或void,它的超類(lèi)返回Null// 如果此對(duì)象是一個(gè)數(shù)組類(lèi),返回表示Object類(lèi)的Class對(duì)象Class superClass = clazz.getSuperclass();System.out.println(clazz.getSimpleName() + "的超類(lèi)是"+ superClass.getName());System.out.println("*********************");// 獲取Person類(lèi)所實(shí)現(xiàn)的接口// 如果Person類(lèi)沒(méi)有實(shí)現(xiàn)任何接口,返回一個(gè)長(zhǎng)度為0的數(shù)組// 如果Person類(lèi)是一個(gè)基本類(lèi)型或者是void,那么也返回一個(gè)長(zhǎng)度為0的數(shù)組Class[] interfaces = clazz.getInterfaces();System.out.println("所實(shí)現(xiàn)的接口有:");for (Class c : interfaces) {System.out.println(c.getName());}System.out.println("******************");}public static void main(String[] args) throws Exception {GetClassInfo getClassInfo = new GetClassInfo();getClassInfo.test("cn.pb.bean.Person");}}02.使用java反射獲取類(lèi)的構(gòu)造函數(shù)的參數(shù)列表,并通過(guò)構(gòu)造函數(shù)實(shí)例化類(lèi)
001.父類(lèi)代碼
package cn.pb.bean;/*** 父類(lèi)* * @author Administrator* */ public class FatherTest {private String teststr = "測(cè)試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}?
002.子類(lèi)代碼
package cn.pb.bean;/*** 測(cè)試類(lèi) 人類(lèi) 繼承了父類(lèi)*/ import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通過(guò)無(wú)參構(gòu)造實(shí)例化Person對(duì)象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通過(guò)有參構(gòu)造實(shí)例化Person對(duì)象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}?
003.測(cè)試代碼
package cn.pb.test;import java.lang.reflect.Constructor;/*** 使用java反射獲取類(lèi)的構(gòu)造函數(shù)的參數(shù)列表,并通過(guò)構(gòu)造函數(shù)實(shí)例化類(lèi)* * @author Administrator* */ public class GetClassConstructorInfo {/*** 通過(guò)反射實(shí)例化類(lèi)的對(duì)象* * @throws Exception*/public void test1() throws Exception {// 參數(shù)calssName,為類(lèi)的全類(lèi)名Class clazz = Class.forName("cn.pb.bean.Person");// 通過(guò)clazz.newInstance()方法,獲取類(lèi)的實(shí)例Object obj = clazz.newInstance();System.out.println("通過(guò)反射實(shí)例化的對(duì)象:" + obj);}/*** 通過(guò)反射獲取類(lèi)的構(gòu)造函數(shù)* * @throws Exception*/public void test2() throws Exception {// 參數(shù)calssName,為類(lèi)的全類(lèi)名Class clazz = Class.forName("cn.pb.bean.Person");// 獲取類(lèi)的構(gòu)造函數(shù),返回類(lèi)的所有公共的構(gòu)造函數(shù)Constructor[] constructors = clazz.getConstructors();System.out.println(clazz.getSimpleName() + "類(lèi)的公共的構(gòu)造函數(shù)以及構(gòu)造函數(shù)的參數(shù)列表類(lèi)型:");for (Constructor constructor : constructors) {System.out.println("構(gòu)造函數(shù)的名稱(chēng)為:" + constructor.getName());// 獲取構(gòu)造函數(shù)的所有參數(shù)Class[] params = constructor.getParameterTypes();if (params.length == 0) {System.out.println("此構(gòu)造函數(shù)沒(méi)有參數(shù)!");} else {System.out.println("該構(gòu)造函數(shù)的參數(shù)列表為:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}}// 獲取無(wú)參構(gòu)造,如果參數(shù)為空,則獲取無(wú)參構(gòu)造Constructor constructor = clazz.getConstructor();// 通過(guò)無(wú)參構(gòu)造方法獲取類(lèi)的實(shí)例Object obj = constructor.newInstance();System.out.println("通過(guò)無(wú)參構(gòu)造實(shí)例化的對(duì)象為:" + obj);/*** 獲取有參構(gòu)造 這個(gè)方法只能獲得公共的有參構(gòu)造 想要獲取私有的構(gòu)造方法 可以使用* clazz.getDeclaredConstructor(int.class, String.class, String.class,* String.class);方法*/Constructor constructor2 = clazz.getConstructor(int.class,String.class, String.class, String.class);Object obj2 = constructor2.newInstance(12, "xiix", "hah", "wawa");System.out.println("通過(guò)有參構(gòu)造實(shí)例化的 對(duì)象為:" + obj2);}public static void main(String[] args) throws Exception {GetClassConstructorInfo test = new GetClassConstructorInfo();// test.test1();test.test2();} }?03.使用java反射獲取類(lèi)的所有方法的信息,并調(diào)用類(lèi)的setter方法進(jìn)行屬性的賦值
?
001.父類(lèi)代碼
package cn.pb.bean;/*** 父類(lèi)* * @author Administrator* */ public class FatherTest {private String teststr = "測(cè)試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}?
002.子類(lèi)代碼
package cn.pb.bean;/*** 測(cè)試類(lèi) 人類(lèi) 繼承了父類(lèi)*/ import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通過(guò)無(wú)參構(gòu)造實(shí)例化Person對(duì)象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通過(guò)有參構(gòu)造實(shí)例化Person對(duì)象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}?
003.測(cè)試代碼
package cn.pb.test;/*** 使用java反射獲取類(lèi)的所有方法的信息,并調(diào)用類(lèi)的setter方法進(jìn)行屬性的賦值*/ import java.lang.reflect.Method;public class GetClassMethodsInfo {/*** 調(diào)用類(lèi)的setter方法進(jìn)行屬性的賦值* * @param className* 類(lèi)的全類(lèi)名* @param propName* 屬性名* @param propType* 屬性類(lèi)型* @param propValue* 屬性值* @throws Exception*/public void invokeSetter(String className, String propName,String propType, Object propValue) throws Exception {// 通過(guò)反射獲取類(lèi)的實(shí)例Class clazz = Class.forName(className);Object obj = clazz.newInstance();// 將傳過(guò)來(lái)的屬性名 轉(zhuǎn)換成set方法String methodName = "set" + propName.substring(0, 1).toUpperCase()+ propName.substring(1);// 根據(jù)set方法名和參數(shù)列表獲取set方法Method method = clazz.getDeclaredMethod(methodName,Class.forName(propType));// 如果需要可以設(shè)置setAccessible方法,設(shè)置為可以訪(fǎng)問(wèn)// method.setAccessible(true);// 調(diào)用方法并傳參 參數(shù)為:方法所屬的對(duì)象和方法的參數(shù)method.invoke(obj, propValue);//System.out.println("通過(guò)set方法給類(lèi)的屬性賦值:" + obj);}/*** 使用java反射獲取類(lèi)的所有方法的信息*/public void showMethods() throws Exception {Method[] methods;// 獲取Person類(lèi)中的所有的方法,不包括繼承的類(lèi)的方法// 如果該類(lèi)或接口沒(méi)有生命任何方法,或者此Class 對(duì)象表示一個(gè)基本數(shù)據(jù)類(lèi)型,一個(gè)數(shù)組類(lèi)或void// 那么返回一個(gè)長(zhǎng)度為0的數(shù)組methods = Class.forName("cn.pb.bean.Person").getDeclaredMethods();System.out.println("******展示方法信息********");for (Method method : methods) {System.out.println("方法名:" + method.getName());System.out.println("方法返回值類(lèi)型:" + method.getReturnType().getName());// 獲取方法的參數(shù)列表Class[] params = method.getParameterTypes();if (params.length == 0) {System.out.println("該方法沒(méi)有參數(shù)!");} else {System.out.println("該方法的參數(shù)列表為:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}// 獲取方法所屬的類(lèi)或接口的class對(duì)象Class declaringClass = method.getDeclaringClass();System.out.println("方法聲明在:" + declaringClass.getName() + "中!");// 獲取方法拋出的異常的類(lèi)型,即throws子句中聲明的異常Class[] exceptions = method.getExceptionTypes();if (exceptions.length > 0) {System.out.println("該方法拋出的異常有:【");for (int i = 0; i < exceptions.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(exceptions[i].getName());}System.out.println("】");}System.out.println("***********************");}}public static void main(String[] args) throws Exception {GetClassMethodsInfo test = new GetClassMethodsInfo();// test.invokeSetter("cn.pb.bean.Person", "name", "java.lang.String",// "zhangsan");test.showMethods();} }?
?04.使用java反射獲取類(lèi)的所有屬性的名稱(chēng)和類(lèi)型,并為其中一個(gè)屬性賦值
001.父類(lèi)代碼
package cn.pb.bean;/*** 父類(lèi)* * @author Administrator* */ public class FatherTest {private String teststr = "測(cè)試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}?
002.子類(lèi)代碼
package cn.pb.bean;/*** 測(cè)試類(lèi) 人類(lèi) 繼承了父類(lèi)*/ import java.io.Serializable;public class Person extends FatherTest implements Serializable {private int id;private String name;private String address;private String message;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();System.out.println("通過(guò)無(wú)參構(gòu)造實(shí)例化Person對(duì)象");}public Person(int id, String name, String address, String message) {super();this.id = id;this.name = name;this.address = address;this.message = message;System.out.println("通過(guò)有參構(gòu)造實(shí)例化Person對(duì)象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}?
003.測(cè)試代碼
package cn.pb.test;import java.lang.reflect.Field;/*** 使用java反射獲取類(lèi)的所有屬性的名稱(chēng)和類(lèi)型,并為其中一個(gè)屬性賦值* * @author Administrator* */ public class GetClassFieldsInfo {/*** 使用java反射獲取類(lèi)的所有屬性的名稱(chēng)和類(lèi)型* * @throws Exception*/public void showFields() throws Exception {Field[] fields;// 獲取Person類(lèi)中的所有字段,但不包括繼承的字段// 如果該類(lèi)或接口不聲明任何字段,或者此Class 對(duì)象表示一個(gè)基本數(shù)據(jù)類(lèi)型,一個(gè)數(shù)組類(lèi)或void// 那么返回一個(gè)長(zhǎng)度為0的數(shù)組fields = Class.forName("cn.pb.bean.Person").getDeclaredFields();// 遍歷System.out.println("**********字段展示***********");for (Field field : fields) {System.out.println("字段名:" + field.getName());System.out.println("字段類(lèi)型:" + field.getType().getName());System.out.println("********************");}}/*** 通過(guò)使用反射操作person類(lèi)的字段 使用java反射獲取類(lèi)的對(duì)象的實(shí)例,并為其中一個(gè)屬性賦值*/public void accessField() throws Exception {// 通過(guò)反射加載一個(gè)Person實(shí)例Class clazz = Class.forName("cn.pb.bean.Person");Object obj = clazz.newInstance();// 通過(guò)getDeclaredField("address")方法 獲取類(lèi)的指定字段Field address = clazz.getDeclaredField("address");// address字段為private,這里已經(jīng)超出其訪(fǎng)問(wèn)范圍,不能直接訪(fǎng)問(wèn)// 通過(guò)setAccessable方法,設(shè)定為可以訪(fǎng)問(wèn)address.setAccessible(true);System.out.println("賦值前的address:" + address.get(obj));// 為address屬性賦值address.set(obj, "北大青鳥(niǎo)");System.out.println("賦值之后的address:" + address.get(obj));}public static void main(String[] args) throws Exception {GetClassFieldsInfo test = new GetClassFieldsInfo();test.showFields();test.accessField();}}轉(zhuǎn)載于:https://www.cnblogs.com/laosunlaiye/p/7679337.html
總結(jié)
以上是生活随笔為你收集整理的反射笔记-----------------------------的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 财付通密码忘了怎么办?不同密码找回方式不
- 下一篇: wordpress 显示数学公式 (Ma