摘要:中有個類,是所有類的繼承根源,其內(nèi)聲明了數(shù)個應該在所有類中被改寫的方法等。其中返回一個對象。對象表示的類或接口聲明的所有方法,包括公共保護默認包訪問和私有方法,但不包括繼承的方法。
原理
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。
Java中有個Object 類,是所有Java 類的繼承根源,其內(nèi)聲明了數(shù)個應該在所有Java 類中被改寫的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class 對象。Class對象十分特殊。他是Java中所有類的實例,借助它可以實現(xiàn)對一個對象的操作。
實例 1. 準備工作
創(chuàng)建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. 創(chuàng)建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類中并沒有公有字段,所以該循環(huán)不輸出任何值 } /** 輸出: privatename privateage */
獲取類屬性的修飾符
上述代碼中有一個方法Modifier.toString(field.getModifiers())即是獲取該屬性的修飾符,field.getModifiers()返回一個int值,將該值轉(zhuǎn)化為對應的描述要用到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)方法包括其繼承類的公用方法,當然也包括它所實現(xiàn)接口的方法。
getDeclaredMethods()對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。當然也包括它所實現(xiàn)接口的方法。
Method[] methods = class1.getDeclaredMethods(); Method[] methods2 = class1.getMethods();
獲取方法的參數(shù)和返回值的類型
method.getParameterTypes():獲取方法參數(shù)類型,返回Class>數(shù)組
method.getReturnType():獲取方法返回值類型,返回Class>對象
Class>[] ty = method.getParameterTypes(); Class> rty = method.getReturnType();
使用反射調(diào)用方法
method.invoke(對象,參數(shù)...)
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());
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65393.html
摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...
摘要:注解是的一個新特性。很重要,生產(chǎn)中我們開發(fā)常用此值表示注解是否可被子元素繼承。類注解方法注解通過反射獲取方法對象此部分內(nèi)容可參考通過反射獲取注解信息注解處理器實戰(zhàn)接下來我通過在公司中的一個實戰(zhàn)改編來演示一下注解處理器的真實使用場景。 前言:Java 注解,對于很多人都不陌生了,但是在公司的實際開發(fā)中,可能讓我們自己去定義注解并應用到生產(chǎn)環(huán)境中的機會比較少,所以會導致一部分人對注解的理解...
摘要:在結(jié)構上引入了頭結(jié)點和尾節(jié)點,他們分別指向隊列的頭和尾,嘗試獲取鎖入隊服務教程在它提出十多年后的今天,已經(jīng)成為最重要的應用技術之一。隨著編程經(jīng)驗的日積月累,越來越感覺到了解虛擬機相關要領的重要性。 JVM 源碼分析之 Jstat 工具原理完全解讀 http://click.aliyun.com/m/8315/ JVM 源碼分析之 Jstat 工具原理完全解讀 http:...
摘要:面試通關要點匯總集部分解答說明如果你有幸能看到的話,本文整體框架來自阿里梁桂釗的博文,總結(jié)的非常不錯。這樣做的目的是對內(nèi)部數(shù)據(jù)進行了不同級別的保護,防止錯誤的使用了對象的私有部分。被繼承的類稱為基類和父類或超類。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面試通關要點匯...
摘要:當活動線程核心線程非核心線程達到這個數(shù)值后,后續(xù)任務將會根據(jù)來進行拒絕策略處理。線程池工作原則當線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請求。當線程池中的數(shù)量等于最大線程數(shù)時默默丟棄不能執(zhí)行的新加任務,不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
閱讀 3329·2021-11-19 09:40
閱讀 3060·2021-09-09 09:32
閱讀 874·2021-09-02 09:55
閱讀 1455·2019-08-26 13:23
閱讀 2530·2019-08-26 11:46
閱讀 1297·2019-08-26 10:19
閱讀 2137·2019-08-23 16:53
閱讀 1131·2019-08-23 12:44