首先了解一下類的概念
了解完類的概念,現在來了解一下反射
獲取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後執行之...