摘要:中有個類,是所有類的繼承根源,其內聲明了數個應該在所有類中被改寫的方法等。其中返回一個對象。對象表示的類或接口聲明的所有方法,包括公共保護默認包訪問和私有方法,但不包括繼承的方法。
原理
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
Java中有個Object 類,是所有Java 類的繼承根源,其內聲明了數個應該在所有Java 類中被改寫的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class 對象。Class對象十分特殊。他是Java中所有類的實例,借助它可以實現對一個對象的操作。
實例 1. 準備工作
創建Person類
public class Person { private String name; private String age; private void shot(){ System.out.println("!!!"); } protected void shot1() { System.out.println("111"); } public String getAge() { return age; } public String getName() { return name; } public void setAge(String age) { this.age = age; } public void setName(String name) { this.name = name; } }2. 創建Class對象
通過getClass()
Person person = new Person(); Class> class2 = person.getClass();
通過Class.forName()
Class> class1 = Class.forName("test0118.testR.Person");
.class
Class> class3 = Person.class;3. 對對象屬性進行操作
獲取類的屬性
getFields()只能訪問類中聲明為公有的字段,私有的字段它無法訪問,能訪問從其它類繼承來的公有方法.
getDeclaredFields()能訪問類中所有的字段,與public,private,protect無關,不能訪問從其它類繼承來的方法
Field[] fields = class1.getDeclaredFields(); Field[] fields2 = class1.getFields(); for (Field field : fields) { System.out.println(Modifier.toString(field.getModifiers()) + field.getName()); } for(Field field:fields2){ System.out.println(Modifier.toString(field.getModifiers())+field.getName());//由于Person類中并沒有公有字段,所以該循環不輸出任何值 } /** 輸出: privatename privateage */
獲取類屬性的修飾符
上述代碼中有一個方法Modifier.toString(field.getModifiers())即是獲取該屬性的修飾符,field.getModifiers()返回一個int值,將該值轉化為對應的描述要用到Modifier.toString()方法。
對類的屬性進行操作
Field field = class1.getField("name"); Object object = class1.newInstance(); field.setAccessible(true);//打破了封裝的特性,允許對私有屬性直接進行操作 field.set(object, "123"); System.out.println(field.get(object));
獲取類的方法
getMethods()返回某個類的所有公用(public)方法包括其繼承類的公用方法,當然也包括它所實現接口的方法。
getDeclaredMethods()對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。當然也包括它所實現接口的方法。
Method[] methods = class1.getDeclaredMethods(); Method[] methods2 = class1.getMethods();
獲取方法的參數和返回值的類型
method.getParameterTypes():獲取方法參數類型,返回Class>數組
method.getReturnType():獲取方法返回值類型,返回Class>對象
Class>[] ty = method.getParameterTypes(); Class> rty = method.getReturnType();
使用反射調用方法
method.invoke(對象,參數...)
Object object = class1.newInstance(); Method method = class1.getMethod("setName", Class.forName("java.lang.String")); method.invoke(object, "123123"); Method method2 = class1.getMethod("getName"); System.out.println((String) method2.invoke(object)); System.out.println(method.getReturnType());
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65393.html
摘要:與都繼承自類,在中也是使用字符數組保存字符串,,這兩種對象都是可變的。采用字節碼的好處語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區別 可變性...
摘要:在結構上引入了頭結點和尾節點,他們分別指向隊列的頭和尾,嘗試獲取鎖入隊服務教程在它提出十多年后的今天,已經成為最重要的應用技術之一。隨著編程經驗的日積月累,越來越感覺到了解虛擬機相關要領的重要性。 JVM 源碼分析之 Jstat 工具原理完全解讀 http://click.aliyun.com/m/8315/ JVM 源碼分析之 Jstat 工具原理完全解讀 http:...
摘要:面試通關要點匯總集部分解答說明如果你有幸能看到的話,本文整體框架來自阿里梁桂釗的博文,總結的非常不錯。這樣做的目的是對內部數據進行了不同級別的保護,防止錯誤的使用了對象的私有部分。被繼承的類稱為基類和父類或超類。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面試通關要點匯...
摘要:當活動線程核心線程非核心線程達到這個數值后,后續任務將會根據來進行拒絕策略處理。線程池工作原則當線程池中線程數量小于則創建線程,并處理請求。當線程池中的數量等于最大線程數時默默丟棄不能執行的新加任務,不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現原理 在這篇文章中,作者有條不紊的將 ja...
閱讀 3206·2021-11-19 09:40
閱讀 3005·2021-09-09 09:32
閱讀 792·2021-09-02 09:55
閱讀 1393·2019-08-26 13:23
閱讀 2403·2019-08-26 11:46
閱讀 1229·2019-08-26 10:19
閱讀 2054·2019-08-23 16:53
閱讀 1072·2019-08-23 12:44