反射和注解本就是一家人,注解離不開反射,這里先將反射的寫法,本文涉到的注解暫時可以不不用理解
1,創建一個類
public class ReflexUser {public String name;private String namePrivate;protected String nameProtected;String nameDefault;public void setName(String name) {this.name = name;Log.e("ReflexUser", "setName: " + name);}protected String getNameProtected() {return nameProtected;}String getNameDefault() {return nameDefault;}private String getNamePrivate() {return namePrivate;}public String getName() {Log.e("ReflexUser", "getName: " + name);return name;}}
2,執行反射相關操作
//反射創建對象//反射獲取class對象,相當于獲取到加載到內存的ReflexUser.classClass<?> classR = Class.forName("com.kx.jetpack.reflex.own.ReflexUser");//反射創建class實例 ,這里相當于new ReflexUser(),如果ReflexUser這個類在其它庫中,無法new 可以通過這個方法創建對象Object o = classR.newInstance();//反射獲取對象方法并且執行//根據名字獲取class中的方法,這里相當于獲取到ReflexUser中getName()這個方法Method getName = classR.getMethod("getName", null);//根據名字獲取class中的方法,這里相當于獲取到ReflexUser中setName()這個方法//getMethod(String name, Class<?>... parameterTypes)有兩個參數,//String name:class中的方法名字//Class<?>... parameterTypes:可變參數,這里相當于方法中設置的參數的類型的class,如果沒有就為空//這里的getName沒有傳入的null,setName有一個String類型,所以傳入的為String.class//getMethod:只能獲取到public方法的方法//getDeclaredField:獲取所有方法Method setName = classR.getMethod("setName", String.class);//執行類的方法,相當余ReflexUser.setName方法setName.invoke(o, "Reflex Method");//執行類的方法,相當余ReflexUser.getName方法//Object invoke(Object obj, Object... args)//Object obj:傳入通過反射創建的對象//Object... args:可變參數,傳入對應方法中的值getName.invoke(o, null);//反射獲取字段//并對字段進行操作,這里獲取到ReflexUser中name字段//getField(String name)通過名字獲取字段,只能獲取到public字段//getDeclaredField(String name):通過名字獲取字段,所有的//這里相當于獲取到ReflexUser.name這個字段Field field = classR.getField("name");//對字段進行賦值//set(Object obj, Object value):Object obj:傳入反射創建的對象,Object value:需要修改的值field.set(o, "Reflex field");//執行獲取到的方法反射打印值是否修改成功getName.invoke(o, null);
打印結果如下: