當我們一開始使用反射的時候,首先理解的是,他可以攔截乙個方法,並執行其方法。
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方法...