反射的學習

2021-08-28 10:32:17 字數 4068 閱讀 4387

首先了解一下類的概念

了解完類的概念,現在來了解一下反射

獲取class檔案物件方法

1.通過物件獲取

2.通過類獲取

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

首先建立乙個類:

public class person 

public person(string name, int age)

// 私有構造方法

public person(int age, string name)

@override

public string tostring()

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

// 吃飯

public void eat()

// 說話

public void speak(string str)

// 打遊戲

private int play(string game)

}

獲取class檔案物件方法如下:
// 通過物件獲取

person p = new person();

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

class<? extends person> c1 = p.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 object = constructor.newinstance();

system.out.println(object);

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

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

// 建立物件

object object2 = constructor2.newinstance("旺旺",30);

system.out.println(object2);

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

前提:1.類必須用public

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

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

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

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

object object = c.newinstance();

system.out.println(object);

獲取構造方法,**如下:
// 獲取類中所有的構造方法(包括私有)

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

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

for (constructor<?> constructor : constructors)

// 獲取私有的構造方法

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

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

constructorp.setaccessible(true);

// 建立物件

object object = constructorp.newinstance(30,"wl");

// 列印物件

system.out.println(object);

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

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

field fields = c.getfields();

for (field field : fields)

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

field field = c.getfield("name");

// 建立乙個person

object object = c.newinstance();

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

field.set(object, "東東");

system.out.println(object);

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

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

// 開啟訪問許可權

agefield.setaccessible(true);

agefield.set(object, 26);

system.out.println(object);

獲取成員方法
class<?> c = class.forname("com.lanou3g.reflect.person");

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

method methods = c.getmethods();

for (method method : methods)

// 獲取指定的成員方法

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

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

method method = c.getmethod("eat");

object object = c.newinstance();

// 呼叫該方法

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

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

// 返回值: 呼叫該方法 方法的返回值

object rel = method.invoke(object);

system.out.println(rel);

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

object rel2 = method2.invoke(object,"國語");

system.out.println(rel2);

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

// 開啟許可權

method3.setaccessible(true);

// 呼叫方法

object rel3 = method3.invoke(object, "lol");

system.out.println(rel3);

反射知識學習

反射 框架設計的靈魂 將類的各個組成部分封裝為其他物件,這就是反射機制 class檔案中儲存編譯後的東西 還在硬碟上 source源 階段 第二階段 類物件階段 類載入器 class類物件 三個物件1,成員變數 field2.構造方法 3成員方法 method 反射機制 new乙個物件是儲存在記憶體...

學習中的反射函式

net反射中如何獲取呼叫引數的值?你在tracemethod裡只傳入了methodinfo,這裡只包含了引數的定義資訊。你這麼想,假設你有個方法 class a 這個時候你可以得到m的引數s的parameterinfo,但是這個時候它根本沒有值 也不應該有 它的值只有當你去呼叫這個方法時才確定。而只...

關於反射的學習理解

先說說網上找到的把 反射 反向獲取jvm虛擬機器中的class類資訊 網上都說是jvm執行時擷取,反正我覺得有點用詞不當,應該是jvm在執行這個class類之前會對它掃瞄一片,如果發現了有用到反射或被反射就截停它,因為計算機執行時是一條線的結構,所以說,應該把反射執行說成jvm載入class後執行之...