1. 概念
定義:反射主要是指程序可以訪問盖腕、檢測和修改它本身狀態(tài)或行為的一種能力钝域。在計(jì)算機(jī)科學(xué)領(lǐng)域妨退,反射是一類應(yīng)用妇萄,它們能夠自描述和自控制。這類應(yīng)用通過某種機(jī)制來實(shí)現(xiàn)對自己行為的描述和檢測碧注,并能根據(jù)自身行為的狀態(tài)和結(jié)果嚣伐,調(diào)整或修改應(yīng)用所描述行為的狀態(tài)和相關(guān)的語義。
做一些做不了的事情 一些不正規(guī)的手段 萍丐。 所有的功能都是基于我們的字節(jié)碼(class) 一個(gè)類的class在內(nèi)存中應(yīng)該只有一份 而且class 其實(shí)也是一個(gè)對象
2.實(shí)例化對象
2.1實(shí)例化一個(gè)無參的構(gòu)造方法
- class.newInstance(); 實(shí)例化一個(gè)無參的構(gòu)造方法
代碼示例:
寫一個(gè)測試的 TestBean.class
public class TestBean {
private String name = "LorenzoGao";
private TestBean() {
}
public void sysName() {
System.out.print(name);
}
}
//使用反射
try {
TestBean testBean=TestBean.class.newInstance();
testBean.sysName();
}catch (Exception e) {
e.printStackTrace();
}
2.2實(shí)例一個(gè)有參數(shù)的構(gòu)造方法
- getConstructor(Class<?>... parameterTypes) 參數(shù)是你構(gòu)造方法的參數(shù)的類型
只返回制定參數(shù)類型訪問權(quán)限是public的構(gòu)造器
- getDeclaredConstructor (Class<?>... parameterTypes) 參數(shù)是你構(gòu)造方法的參數(shù)的類型
這個(gè)方法會返回制定參數(shù)類型的所有構(gòu)造器轩端,包括public的和非public的,當(dāng)然也包括private的
public class TestBean{
private String name = "LorenzoGao";
private TestBean(String name) {
this.name = name;
}
public void sysName() {
System.out.print(name);
}
}
//使用反射
try {
Constructor constructor = TestBean.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
TestBean bean = (TestBean) constructor.newInstance("Hello");//調(diào)用構(gòu)造方法傳的參數(shù),前提是不是用private修飾 等同于new TestBean("Hello")
bean.sysName();
} catch (Exception e) {
e.printStackTrace();
}
2.3 實(shí)例化一個(gè)連XXX.class都拿不到的構(gòu)造方法 逝变,如ActivityThread.class
try {
Class clazz = Class.forName("android.app.ActivityThread");
Field field = clazz.getDeclaredField("sCurrentActivityThread");
field.setAccessible(true);
Object object =field.get(null); //static 修飾 跟對象是沒關(guān)系 基茵,跟類是有關(guān)系 所以可以傳個(gè)null
System.out.print(object.toString());
} catch (Exception e) {
e.printStackTrace();
}
3.方法調(diào)用
- getDeclaredMethod(String name, Class<?>... parameterTypes) ,
獲得對象所聲明的public的和非public的壳影,當(dāng)然也包括private的
- getDeclaredMethods()
返回所有的方法拱层,包括public的和非public的,當(dāng)然也包括private的
- getMethod(String name, Class<?>... parameterTypes)
獲得對象所聲明的public方法
- getMethods()
返回所有是public的方法
- invoke(Object obj, Object... args)
執(zhí)行方法 obj表示執(zhí)行者宴咧,args表示傳入方法參數(shù)根灯,無參方法,可不傳掺栅。
name 表示方法名烙肺,parameterTypes 表示的有參方法的參數(shù)類型
3.1獲取一個(gè)無參方法
public class TestBean {
private String name = "LorenzoGao";
public TestBean(String name) {
this.name = name;
}
private void sysName() {
System.out.print(name);
}
}
//反射獲取方法
try {
TestBean bean=new TestBean("Hello");
Method method = TestBean.class.getDeclaredMethod("sysName");
method.setAccessible(true);
method.invoke(bean); //表示bean去執(zhí)行這個(gè)方法
} catch (Exception e) {
e.printStackTrace();
}
3.2獲取一個(gè)有參方法
public class TestBean {
private String name = "LorenzoGao";
public TestBean(String name) {
this.name = name;
}
private void sysName() {
System.out.print(name);
}
private void sysName(String params) {
System.out.print(params);
}
}
//反射
try {
TestBean bean=new TestBean("Hello");
Method method =TestBean.class.getDeclaredMethod("sysName",String.class);
method.setAccessible(true);
method.invoke(bean,"哈哈哈");
} catch (Exception e) {
e.printStackTrace();
}
4.獲取屬性
- getDeclaredField(String name)
獲取對象里面指定名字的public和private 修飾的屬性
- getDeclaredFields()
獲取對象里面所有public和private 修飾的屬性
- getField(String name)
獲取對象里面指定名字的public 修飾的屬性
- getFields()
獲取對象里面所有的public 修飾的屬性
name 表示屬性名字
public class TestBean {
private String name = "LorenzoGao";
public TestBean(String name) {
this.name = name;
}
private void sysName() {
System.out.print(name);
}
private void sysName(String params) {
System.out.print(params);
}
}
//反射獲取屬性
try {
TestBean testBean = new TestBean("123");
Field field = TestBean.class.getDeclaredField("name");
field.setAccessible(true);
String name = (String) field.get(testBean);//獲取值
System.out.print(name);
} catch (Exception e) {
e.printStackTrace();
}
}
總是對反射概念很模糊,寫一篇手記來總結(jié)一下氧卧。