反射筆記-----------------------------

1.反射基本概念:

?

01.定義:

反射是指在程序運行期間,能夠觀察和修改類或者類的對象的屬性和行為的特性!

?

?

02.作用:

001.在運行期間獲取類的修飾符,包名,類名,實現的接口,繼承的父類。

002.在運行期間獲取類的所有屬性名,修飾符,屬性類型。

003.在運行期間獲取所有方法,方法的返回值類型,方法名,方法參數數量,方法參數類型。

004.在運行期間加載類的方法。

?

?

03.java反射API常用的類

001.java.lang.Class

002.java.lang.reflect.Method

003.java.lang.Constructor

004.java.lang.Filed

005.java.lang.Modifier

2.例子

01.使用java反射獲取類的信息

001.父類代碼

復制代碼
package cn.pb.bean;/*** 父類* * @author Administrator* */
public class FatherTest {private String teststr = "測試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
復制代碼

002.子類代碼

復制代碼
package cn.pb.bean;/*** 測試類 人類  繼承了父類*/
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.測試類代碼:

復制代碼
package cn.pb.test;/*** 測試類 通過反射獲取類的信息* * @author Administrator* */
public class GetClassInfo {public void test(String className) throws Exception {// 獲取Person類對象 傳遞的className為類的全類名Class clazz = Class.forName(className);// 獲取類在的包名 clazz.getSimpleName():獲取類名Package pkg = clazz.getPackage();System.out.println(clazz.getSimpleName() + "定義在" + pkg.getName()+ "包中!");System.out.println("*********************");// 獲取此對象所表示的實體(類,接口,基本類型或者void)的超類Class// 如果此對象是一個Object類,一個接口,一個基本類型或void,它的超類返回Null// 如果此對象是一個數組類,返回表示Object類的Class對象Class superClass = clazz.getSuperclass();System.out.println(clazz.getSimpleName() + "的超類是"+ superClass.getName());System.out.println("*********************");// 獲取Person類所實現的接口// 如果Person類沒有實現任何接口,返回一個長度為0的數組// 如果Person類是一個基本類型或者是void,那么也返回一個長度為0的數組Class[] interfaces = clazz.getInterfaces();System.out.println("所實現的接口有:");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反射獲取類的構造函數的參數列表,并通過構造函數實例化類

001.父類代碼

復制代碼
package cn.pb.bean;/*** 父類* * @author Administrator* */
public class FatherTest {private String teststr = "測試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
復制代碼

?

002.子類代碼

復制代碼
package cn.pb.bean;/*** 測試類 人類  繼承了父類*/
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("通過無參構造實例化Person對象");}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("通過有參構造實例化Person對象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
復制代碼

?

003.測試代碼

復制代碼
package cn.pb.test;import java.lang.reflect.Constructor;/*** 使用java反射獲取類的構造函數的參數列表,并通過構造函數實例化類* * @author Administrator* */
public class GetClassConstructorInfo {/*** 通過反射實例化類的對象* * @throws Exception*/public void test1() throws Exception {// 參數calssName,為類的全類名Class clazz = Class.forName("cn.pb.bean.Person");// 通過clazz.newInstance()方法,獲取類的實例Object obj = clazz.newInstance();System.out.println("通過反射實例化的對象:" + obj);}/*** 通過反射獲取類的構造函數* * @throws Exception*/public void test2() throws Exception {// 參數calssName,為類的全類名Class clazz = Class.forName("cn.pb.bean.Person");// 獲取類的構造函數,返回類的所有公共的構造函數Constructor[] constructors = clazz.getConstructors();System.out.println(clazz.getSimpleName() + "類的公共的構造函數以及構造函數的參數列表類型:");for (Constructor constructor : constructors) {System.out.println("構造函數的名稱為:" + constructor.getName());// 獲取構造函數的所有參數Class[] params = constructor.getParameterTypes();if (params.length == 0) {System.out.println("此構造函數沒有參數!");} else {System.out.println("該構造函數的參數列表為:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}}// 獲取無參構造,如果參數為空,則獲取無參構造Constructor constructor = clazz.getConstructor();// 通過無參構造方法獲取類的實例Object obj = constructor.newInstance();System.out.println("通過無參構造實例化的對象為:" + obj);/*** 獲取有參構造 這個方法只能獲得公共的有參構造 想要獲取私有的構造方法 可以使用* 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("通過有參構造實例化的 對象為:" + obj2);}public static void main(String[] args) throws Exception {GetClassConstructorInfo test = new GetClassConstructorInfo();// test.test1();test.test2();}
}
復制代碼

?03.使用java反射獲取類的所有方法的信息,并調用類的setter方法進行屬性的賦值

?

001.父類代碼

復制代碼
package cn.pb.bean;/*** 父類* * @author Administrator* */
public class FatherTest {private String teststr = "測試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
復制代碼

?

002.子類代碼

復制代碼
package cn.pb.bean;/*** 測試類 人類  繼承了父類*/
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("通過無參構造實例化Person對象");}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("通過有參構造實例化Person對象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
復制代碼

?

003.測試代碼

復制代碼
package cn.pb.test;/*** 使用java反射獲取類的所有方法的信息,并調用類的setter方法進行屬性的賦值*/
import java.lang.reflect.Method;public class GetClassMethodsInfo {/*** 調用類的setter方法進行屬性的賦值* * @param className*            類的全類名* @param propName*            屬性名* @param propType*            屬性類型* @param propValue*            屬性值* @throws Exception*/public void invokeSetter(String className, String propName,String propType, Object propValue) throws Exception {// 通過反射獲取類的實例Class clazz = Class.forName(className);Object obj = clazz.newInstance();// 將傳過來的屬性名 轉換成set方法String methodName = "set" + propName.substring(0, 1).toUpperCase()+ propName.substring(1);// 根據set方法名和參數列表獲取set方法Method method = clazz.getDeclaredMethod(methodName,Class.forName(propType));// 如果需要可以設置setAccessible方法,設置為可以訪問// method.setAccessible(true);// 調用方法并傳參 參數為:方法所屬的對象和方法的參數method.invoke(obj, propValue);//System.out.println("通過set方法給類的屬性賦值:" + obj);}/*** 使用java反射獲取類的所有方法的信息*/public void showMethods() throws Exception {Method[] methods;// 獲取Person類中的所有的方法,不包括繼承的類的方法// 如果該類或接口沒有生命任何方法,或者此Class 對象表示一個基本數據類型,一個數組類或void// 那么返回一個長度為0的數組methods = Class.forName("cn.pb.bean.Person").getDeclaredMethods();System.out.println("******展示方法信息********");for (Method method : methods) {System.out.println("方法名:" + method.getName());System.out.println("方法返回值類型:" + method.getReturnType().getName());// 獲取方法的參數列表Class[] params = method.getParameterTypes();if (params.length == 0) {System.out.println("該方法沒有參數!");} else {System.out.println("該方法的參數列表為:【");for (int i = 0; i < params.length; i++) {if (i != 0) {System.out.println(",");}System.out.println(params[i].getName());}System.out.println("】");}// 獲取方法所屬的類或接口的class對象Class declaringClass = method.getDeclaringClass();System.out.println("方法聲明在:" + declaringClass.getName() + "中!");// 獲取方法拋出的異常的類型,即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反射獲取類的所有屬性的名稱和類型,并為其中一個屬性賦值

001.父類代碼

復制代碼
package cn.pb.bean;/*** 父類* * @author Administrator* */
public class FatherTest {private String teststr = "測試用";public String getTeststr() {return teststr;}public void setTeststr(String teststr) {this.teststr = teststr;}}
復制代碼

?

002.子類代碼

復制代碼
package cn.pb.bean;/*** 測試類 人類  繼承了父類*/
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("通過無參構造實例化Person對象");}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("通過有參構造實例化Person對象");}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", address=" + address+ ", message=" + message + "]";}}
復制代碼

?

003.測試代碼

復制代碼
package cn.pb.test;import java.lang.reflect.Field;/*** 使用java反射獲取類的所有屬性的名稱和類型,并為其中一個屬性賦值* * @author Administrator* */
public class GetClassFieldsInfo {/*** 使用java反射獲取類的所有屬性的名稱和類型* * @throws Exception*/public void showFields() throws Exception {Field[] fields;// 獲取Person類中的所有字段,但不包括繼承的字段// 如果該類或接口不聲明任何字段,或者此Class 對象表示一個基本數據類型,一個數組類或void// 那么返回一個長度為0的數組fields = Class.forName("cn.pb.bean.Person").getDeclaredFields();// 遍歷System.out.println("**********字段展示***********");for (Field field : fields) {System.out.println("字段名:" + field.getName());System.out.println("字段類型:" + field.getType().getName());System.out.println("********************");}}/*** 通過使用反射操作person類的字段 使用java反射獲取類的對象的實例,并為其中一個屬性賦值*/public void accessField() throws Exception {// 通過反射加載一個Person實例Class clazz = Class.forName("cn.pb.bean.Person");Object obj = clazz.newInstance();// 通過getDeclaredField("address")方法 獲取類的指定字段Field address = clazz.getDeclaredField("address");// address字段為private,這里已經超出其訪問范圍,不能直接訪問// 通過setAccessable方法,設定為可以訪問address.setAccessible(true);System.out.println("賦值前的address:" + address.get(obj));// 為address屬性賦值address.set(obj, "北大青鳥");System.out.println("賦值之后的address:" + address.get(obj));}public static void main(String[] args) throws Exception {GetClassFieldsInfo test = new GetClassFieldsInfo();test.showFields();test.accessField();}}

轉載于:https://www.cnblogs.com/laosunlaiye/p/7679337.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251688.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251688.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251688.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kubernetes 集群部署

kubernetes 集群部署 環境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已開通 4C8G80G 集群規劃 部署方式 環境準備&#xff1a;基于主機名稱通信&#xff0c;時間同步&#xff0c;關…

PHP學習筆記--抽象類和抽象方法的應用

抽象類** 什么是抽象方法&#xff1f;** 定義&#xff1a;如果一個類中的方法&#xff0c;沒有方法體的方法就是抽象方法(就是一個方法沒有使用{}而直接使用分號結束)* * abstract function test(); //抽象方法* * function test(){ //有方法體…

wordpress 顯示數學公式 (MathJax-LaTeX)

blog 不放一堆數學公式怎么能顯得高大上&#xff0c;所以 MathJax-LaTeX 也是必裝的插件之一了。 一、安裝 MathJax-LaTex 插件 直接在 wordpress 插件中&#xff0c;搜索并安裝 MathJax-LaTeX 二、安裝本地 MathJax 服務 不過由默認的 MathJax cdn 服務經常被墻&#xff0c;所…

長春理工大學第十四屆程序設計競賽(重現賽)F.Successione di Fixoracci

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/912/F 題意&#xff1a; 動態規劃(Dynamic programming&#xff0c;簡稱dp)是一種通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。例如&#xff0c;假設小x一步能爬1層或2層臺階&#xff0c;求小x爬n層臺階…

ConstraintLayout

ConstraintLayout使用筆記 具體使用參考&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好處還是很明顯&#xff0c;確實可以減少嵌套。性能對比參閱&#xff1a;http://www.cnblogs.com/liujingg/p/7161319.html 簡單嵌套Constrain…

css權重

權重大小 內嵌權重為1000 <p style"color: yellow;">ALEX</p> id選擇器的權重為100&#xff0c;類選擇器的權重為10&#xff0c;標簽選擇器的權重為1. /*1 1 1*/ #box1 .wrap2 p{color: red; }當權重一樣的時候&#xff0c;是以后設置的屬性為準&#xf…

手機兩列布局,正方形

手機兩列布局&#xff0c;正方形。 直接貼出調試網站的結果&#xff0c;閱讀效果還不錯。 轉載于:https://www.cnblogs.com/blogzhang/p/11002428.html

python(5)- 基礎數據類型

一 int 數字類型 #abs(x)      返回數字的絕對值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回數字的上入整數&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

B s

666 轉載于:https://www.cnblogs.com/lovelgx/articles/9099239.html

基于HTK的語音撥號系統

為什么80%的碼農都做不了架構師&#xff1f;>>> 基于 HTK 的語音撥號系統 Veket NWPU 2011-6-22 目標&#xff1a; 該系統能夠識別連續說出的數字串和若干組姓名。建模是針對子詞&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL無法重啟問題解決Warning: World-writable config file '/etc/my.cnf' is ignored

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天幫朋友維護服務器&#xff0c;在關閉數據庫的命令發現mysql關不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是權限全局可寫&#xff0c;任何一個用戶都…

用戶體驗分析: 以 “南通大學教務管理系統微信公眾號” 為例

基于實例分析&#xff0c;體會用戶體驗設計的 7 條準則&#xff0c;分析“南通大學教務管理系統微信公眾號” 在用戶體驗設計方面讓你覺得滿意的地方&#xff08;不少于2點&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;請陳述理由。 同樣&#xff0c;分析…

JVM學習筆記(一):Java內存區域

由于Java程序是交由JVM執行的&#xff0c;所以我們在談Java內存區域劃分的時候事實上是指JVM內存區域劃分。在討論JVM內存區域劃分之前&#xff0c;先來看一下Java程序具體執行的過程&#xff1a; 首先Java源代碼文件(.java后綴)會被Java編譯器編譯為字節碼文件(.class后綴)&am…

EdgeRouter X設置外網遠程訪問和HTTPS連接指定出口網關

EdgeRouter X雖然小巧&#xff0c;但功能強大&#xff0c;為方便遠程管理&#xff0c;必須對防火墻進行設置&#xff0c;允許從外部進行訪問&#xff0c;由于公網的80、443端口都已被運營商關閉&#xff0c;必須設置端口轉發才能從外部訪問。一、設置外網遠程訪問通過瀏覽器進入…

overflow妙用--去除默認滾動條,內容仍可滾動

在開發中我們往往要去除默認滾動條&#xff0c;但是其在豎直方向的滾動效果仍然需要。 <div id"parent"><div id"child"><h1>文本區</h1><h1>文本區</h1><h1>文本區</h1></div> </div> #pare…

數據倉庫基礎(二)ETL

本文轉載自&#xff1a;http://www.cnblogs.com/evencao/archive/2013/06/14/3135529.html ETL在數據倉庫中具有以下的幾個特點&#xff1a; 數據流動具有周期性&#xff1a; 因為數據倉庫中的數據量巨大&#xff0c;一般采用成熟的ETL工具去完成抽取、轉換、加載&#xff0c;以…

CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]

為什么80%的碼農都做不了架構師&#xff1f;>>> /// <summary> /// CSV出力ボタンラッパー。 /// </summary> public class CsvOutputButtonWrapper { /// <summary> /// CSV出力ボタン /// </summary> …

結構體變量字節填充

二&#xff1a; &#xff08;1&#xff09;sizeof也可以對一個函數調用求值&#xff0c;其結果是函數返回類型的大小&#xff0c;函數并不會被調用。 &#xff08;2&#xff09;終于搞懂struct結構體內存分配問題了&#xff0c;結構體中各個成員字節對齊遵循以下幾個原則&#…

iOS GoldRaccoon第三方FTP文件夾下載失敗原因

一、問題描述&#xff1a;1.下載失敗報錯&#xff1a; 文件寫入失敗Error DomainNSCocoaErrorDomain Code512 "未能將文件“jquery_1_10_2_min.js”存儲到文件夾“Q20180104153006399”中。" 原因及解決方法&#xff1a;文件夾下均為文件&#xff0c;不包含子文件夾&…

項目UML設計(團隊)

團隊信息 隊名&#xff1a;massivehard 組長&#xff1a;曉輝 隊員&#xff1a;一飛&#xff0c;帥珍&#xff0c;斌豪&#xff0c;錦謀 團隊分工 模塊序號模塊名模塊具體內容1日記編輯添加隨筆2照片選擇選擇照片識別3消息模塊收發消息4個人信息賬號&#xff0c;密碼等負責人分…