反射的使用

2021-09-12 01:55:21 字數 3036 閱讀 4320

當我們一開始使用反射的時候,首先理解的是,他可以攔截乙個方法,並執行其方法。

com.ml.maskpro.ui.mainactivity中包含如下方法:
public string getname(string name) 

private string getage(int age)

然後我們攔截這兩個方法如下:

public static void inject3(activity activity)  catch (exception e) 

}public static void inject4(activity activity) catch (exception e)

}

列印結果:

03-06 11:20:46.323 10524-10524/com.ml.maskpro.debug e/reflectdemo: show()方法的返回值:劉德華的歌迷

03-06 11:20:46.323 10524-10524/com.ml.maskpro.debug e/reflectdemo: getage()方法的返回值:歌迷的年齡12

通過以上的**,我們觸及了一些新的方法,讓我們現在學習下這些在反射中使用的方法:

1)使用反射,首先需要獲取對類的位元組流

// 通過物件獲取

student stu1 = new student();

class stuclass = stu1.getclass();

//「靜態」的class屬性

class stuclass2 = student.class;

//真實路徑,就是帶包名的類路徑,包名.類名

class stuclass3 = class.forname("fanshe.student");

2)執行類的建構函式

public static void inject() 

/*** 呼叫私有乙個引數的建構函式

*/constructor cone = clazz.getdeclaredconstructor(string.class);

cone.setaccessible(true);//暴力訪問(忽略掉訪問修飾符)

cone.newinstance("男");

} catch (exception e)

}public class demo

private demo(string name)

}

執行結果:

03-06 14:36:59.920 11800-11800/com.ml.maskpro.debug e/reflectdemo: com.ml.butterknifelib.demo

03-06 14:36:59.920 11800-11800/com.ml.maskpro.debug e/reflectdemo: demo 的建構函式被執行

03-06 14:36:59.921 11800-11800/com.ml.maskpro.debug e/reflectdemo: demo 的建構函式被執行=男

方法解析: 

方法解析

getconstructors()

獲取 所有"公有的"構造方法

getdeclaredconstructors()

獲取所有的構造方法(包括私有、受保護,公有)

getconstructor()

獲取"公有的"構造方法

getdeclaredconstructor()

獲取 構造方法

newinstance()

執行建構函式

3)獲取類的成員變數

/**

* 給類中的變數賦值

*/field fied = clazz.getfield("name"); //獲取name引數

object obj = clazz.getconstructor().newinstance(); //執行建構函式,獲取類例項

fied.set(obj, "劉德華"); //給該name引數賦值

demo demo = (demo)obj;

log.e("reflectdemo","引數:"+demo.name);

方法解析:

返回方法

說明field

getfields()

獲取所有公有的字段

field

getfield(" ")

獲取指定字段

field.set(obj, "劉德華")

給引數賦值,obj是物件

setaccessible(true)

解除私有限制

4)獲取成員方法並呼叫

public static void inject()  catch (exception e) 

}。。。。

public string show(string s)

執行結果:

03-06 15:25:02.762 12768-12768/com.ml.maskpro.debug e/reflectdemo: 呼叫了:公有的,string引數的show1(): s = 劉德華

03-06 15:25:02.762 12768-12768/com.ml.maskpro.debug e/reflectdemo: 返回=成功

返回方法

說明method

getmethods()

獲取所有公有方法

method

getdeclaredmethods()

獲取所有方法

method

getmethod("方法名", "入引數型別")

獲取指定方法

object

invoke(" "," ")

執行該方法

反射的使用

1.首先我們得知道什麼是反射?反射其實就是通過class檔案物件去獲取該檔案中的成員變數,構造方法,成員方法。2.獲取class檔案物件的方式有三種 第一種是通過object類中的getclass 方法來獲取 student s new student class c1 s.getclass 第二種...

反射的使用

1.將主程式介面上的icon賦給基類內的icon 同時其他子類也具有了此icon public partial class baseform form 2 獲取介面 assembly assembly assembly.loadfrom system.io.path.getdirectoryname...

c 反射的使用

獲取具有指定名稱的type,執行區分大小寫的搜尋。tips gettype包括object.gettype 和type.gettype6個過載靜態方法 type ty type.gettype exthomeexpansion.view.zyl 通過引導程式集也可以獲得對應類的型別 其中load方法...