<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1.通過反射,我們可以構建範例,得到成員變數的值,得到方法並呼叫。
還可以獲得定義在成員變數、方法、方法引數上的註解。
接下來看程式碼實現,然後講原理。
1)構建無參範例:通過反射呼叫無參建構函式
//1.通過全類名載入位元組碼物件 Class clazz = Class.forName("com.example.lib.Person"); //2.通過類的位元組碼拿到定義的建構函式 Constructor constructor = clazz.getConstructor(); //3.通過構造方法建立物件 Object obj = constructor.newInstance();
2)構建有引數範例:
//1.通過全類名載入位元組碼物件 Class clazz = Class.forName("com.example.lib.Person"); //2.通過類的位元組碼拿到定義的建構函式 Constructor constructor = clazz.getConstructor(int.class,String.class); //3.通過構造方法建立物件 Object obj = constructor.newInstance(20,"xiaohua");
3)通過反射獲取成員變數的值。
//4.通過屬性名獲取屬性 Field field = clazz.getDeclaredField("age"); field.setAccessible(true); //5.呼叫get方法拿到物件obj屬性age的值 Integer age = (Integer) field.get(obj);
4)通過反射呼叫物件的方法。
//4.通過方法名和引數型別,拿到方法 method = clazz.getMethod("setAge", int.class); //5.呼叫方法 obj是哪個物件身上的方法。 method.invoke(obj, 21); method = clazz.getMethod("getAge"); method.invoke(obj);
5).通過反射獲取靜態變數的值。
//1.通過全類名載入位元組碼物件 Class clazz = Class.forName("com.example.lib.Person"); //2.獲取靜態屬性ID Field field = clazz.getField("ID"); field.setAccessible(true); //3.拿到靜態屬性ID的值。 // 因為靜態變數存在方法區,在物件建立之前,就已經加裝到了記憶體 //所以,沒有物件,也可以獲取變數的值,這裡傳null也是可以的。 int id = (int) field.get(null);
2.通過反射獲取定義的註解的值
1)獲取成員變數的註解以及值。
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface BindView { int value(); }
public class MainActivity { @BindView(10000) TextView textView; }
//10通過反射拿到定義在屬性上的註解 Class clazz = MainActivity.class; Field textView = clazz.getDeclaredField("textView"); BindView bindView = textView.getAnnotation(BindView.class); int txtId = bindView.value();
3)通過反射獲取定義在方法和方法引數上的註解以及值
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Post { String value() default ""; }
public interface NetWorkInterface { @Post("http://www.baidu.com") Call getPerson(@Queue("name") String name, @Queue("200") int price); }
//11通過反射拿到方法上定義的註解 clazz = NetWorkInterface.class; Method method = clazz.getMethod("getPerson", String.class, int.class); //獲取Post註解 Post post = method.getAnnotation(Post.class); //獲取值 String url = post.value();
//12通過反射拿到引數上的註解 //為是個二維陣列,因為方法引數會有多個,一個引數有可能定義多個註解 Annotation[][] annotations = method.getParameterAnnotations(); for (Annotation[] ans : annotations) { for (Annotation an : ans) { if (an instanceof Queue) { Queue queue = (Queue) an; String value = queue.value(); } } }
4)獲取方法的引數和返回值型別。
//13.拿到方法引數的型別。 Type[] types = method.getGenericParameterTypes(); for (Type type : types) { System.out.println(type.toString()); } //14.獲取方法返回值型別 Type type = method.getGenericReturnType();
3總結:通過反射,可以拿到物件身上的成員變數的值、呼叫方法,獲取定義在成員變數、方法和 方法引數上的註解。Retrofit 就用到了註解加反射技術,和動態代理(這個技術稍後分享)
4.通過反射,可以做到以上事情。反射的原理是啥?
1)我們寫的原始碼是.java檔案,通過javac編譯後成為.class檔案,即位元組碼檔案。
2)程式執行時,JVM會類載入位元組碼檔案到記憶體,嚴格意義上說是載入到方法區,並轉換成
java.lang.Class物件。萬事萬物皆物件,Class被稱為類物件,描述類在後設資料空間的資料結構,包含類中定義的屬性、方法、構造方法、註解、介面等資訊。
所有反射的第一步是拿到類物件Class物件。拿到了Class物件,也就拿到了類中定義的一切。
Class clazz = Class.forName("com.example.lib.Person");
這行程式碼就是通過類載入器把Person類載入到記憶體,並得到對應的Class 物件。
到此這篇關於Java反射機制介紹的文章就介紹到這了,更多相關Java反射內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45