萌新學Java之漸入佳境四 反射

2021-08-28 10:32:17 字數 4341 閱讀 6205

/*

* 獲取class檔案物件

* 1.通過物件獲取

* 2.通過類獲取

* 3.通過class中的 靜態方法獲取(classforname() 常用)

*/

//通過物件獲取

person person = new person();

//獲取person類的 class檔案物件

class<? extends person> c1 = person.getclass();

system.out.println(c1);

//通過類獲取

classc2 = person.class;

system.out.println(c2);

//常用(只需要乙個字串 就能獲取該類的class物件)

//注意:引數要填全類名 包名+類名

class<?> c3 = class.forname("com.lanou3g.reflect.person");

system.out.println(c3);

//通過class檔案物件 獲取類中構造方法

class<?> c = class.forname(「com.lanou3g.reflect.person」);

// 獲取所有的公有的(public)構造方法

constructor<?> constructors = c.getconstructors();

//遍歷

for (constructor<?> constructor : constructors)

//獲取單個構造方法

constructor<?> constructor = c.getconstructor();

//利用該構造方法建立物件

object newinstance = constructor.newinstance();

system.out.println(newinstance);

//有參構造建立物件(引數是 引數類的檔案型別)

constructor<?> constructor1 = c.getconstructor(string.class, int.class);

object newinstance2 = constructor1.newinstance("王龍",30);

system.out.println(newinstance2);

/*

* 通過class檔案物件 快速建立物件

* 前提:

* 1.類必須用public

* 2.必須提供無參構造方法

* 3.該無參構造方法必須是public修飾

*/

class<?> c = class.forname(「com.lanou3g.reflect.person」);

//快速建立物件(直接使用類中 無參構造方法建立)

object object = c.newinstance();

system.out.println(object);

//獲取類中所有的構造方法(包括私有)

//通過class檔案物件 獲取類中構造方法

class<?> c = class.forname(「com.lanou3g.reflect.person」);

constructor<?> declaredconstructors = c.getdeclaredconstructors();

for (constructor<?> constructor : declaredconstructors)

//獲取私有的構造方法

constructor<?> declaredconstructor = c.getdeclaredconstructor(int.class,string.class);

//開啟私有方法使用許可權

declaredconstructor.setaccessible(true);

//建立物件

object newinstance = declaredconstructor.newinstance(30,「王龍」);

//列印物件

system.out.println(newinstance);

//通過class檔案物件 獲取類中構造方法

class<?> c = class.forname(「com.lanou3g.reflect.person」);

//獲取所有公開的成員變數

field fields = c.getfields();

for (field field : fields)

//單獨獲取指定成員變數

field field = c.getfield(「name」);

//建立乙個person

object newinstance = c.newinstance();

//通過反射 給該屬性賦值

field.set(newinstance, 「gorilla」);

system.out.println(newinstance);

//獲取私有成員變數 age 並 賦值 列印

field declaredfield = c.getdeclaredfield("age");

//開啟訪問許可權

declaredfield.setaccessible(true);

declaredfield.set(newinstance, 30);

system.out.println(newinstance);

class<?> c = class.forname(「com.lanou3g.reflect.person」);

//獲取類中所有的公開方法(包括父類的)

method methods = c.getmethods();

for (method method : methods)

//獲取指定的成員方法

//引數1: 獲取的方法名字

//引數2: 獲取的方法的引數的class型別

method method = c.getmethod(「eat」);

system.out.println(method);

//呼叫該方法

method.setaccessible(true);

object newinstance = c.newinstance();

//引數1:呼叫該方法的物件

//引數2:呼叫該方法 要傳入的引數

object invoke = method.invoke(newinstance);

system.out.println(invoke);

method method2 = c.getmethod("speak", string.class);

object invoke2 = method2.invoke(newinstance, "國語教學");

system.out.println(invoke2);

method declaredmethod = c.getdeclaredmethod("play", string.class);

//開啟許可權

declaredmethod.setaccessible(true);

//呼叫方法

object invoke3 = declaredmethod.invoke(newinstance, "lol");

system.out.println(invoke);

/*

* 利用反射

* 向arrarylist中 新增 integer資料 person物件

* 注意: 編譯成class檔案 泛型不存在

*/

arraylistlist = new arraylist<>();
//獲取class檔案物件 arraylist

class<? extends arraylist> class1 = list.getclass();

//獲取arraylist類中的 add方法

method method = class1.getmethod("add", object.class);

//呼叫該方法存值

method.invoke(list, 123);

method.invoke(list, new person("王龍",30));

method.invoke(list, "哈哈");

//列印檢視

system.out.println(list);

2020 7 30 漸入佳境

學到的題目 賽後總結反思 集訓第4天,中午12 00開始組隊賽。開始的時候不知道先做哪個題,看了看排名,有人交了c題 只不過錯了 我們就開始研究c題,乍一看是乙個字串的題,其實是乙個動腦子的 思維 題,轉戰a題,a題比較簡單,老孔有思路直接碼出,我們看著也沒什麼問題就讓他交了一下 翻車了,仔細檢查一...

redis漸入佳境 05 zset型別

zset就是有序集合,除了集合的特性外還對每乙個集合元素新增了乙個順序的屬性,zadd方法使用具體如下 zadd 集合名 序號 集合元素 zrage方法的使用具體如下 zrange 集合名 開始位置 結束位置 withscores withscores 是指的是否顯示序號 redis 127.0.0...

讓你的iOS學習漸入佳境

ios 應用開發入門 容易上手卻不簡單的課程,圍繞著swift語法介紹了物件導向程式設計,通過這門課能夠掌握swift語言和找到物件,是 ios 開發者 課程的最佳入門。ios 開發者 真正意義的ios開發之旅 學習一門語言,不做專案學起來極慢無比 甚至可以說根本學不會 但是光做專案不看語言文件就只...