當前位置:
首頁 > 最新 > Java反射獲取類和對象信息全解析

Java反射獲取類和對象信息全解析

反射可以解決在編譯時無法預知對象和類是屬於那個類的,要根據程序運行時的信息才能知道該對象和類的信息的問題。

在兩個人協作開發時,你只要知道對方的類名就可以進行初步的開發了。

獲取類對象

Class.forName(String clazzName)靜態方法

調用類的class屬性,Person.class返回的就是Person的class對象(推薦使用)

調用某個對象的getClass()方法

具體使用還是要根據實際來選擇,第一種方式是比較自由的,只要知道一個類名就可以了,其不會做該類是否存在的校驗,第二種、第三種則會做校驗

獲取類的信息

獲取類構造器

:返回此Class對象對應類的帶指定形參的public構造器

:返回此Class對象對應類的所有public構造器

:返回此class對象對應類的帶指定參數的構造器,與構造器的訪問許可權無關

:返回此class對象對應類的所有構造器,與構造器的訪問許可權無關

獲取類成員方法

:返回此class對象對應類的帶指定形參的public方法

:返回此class對象所表示的類的所有public方法

:返回此class對象對應類的帶指定形參的方法,與方法訪問許可權無關

:返回此class對象對應類的全部方法,與方法的訪問許可權無關

獲取類成員變數

:返回此class對象對應類的指定名稱的public成員變數

:返回此class對象對應類的所有public成員變數

:返回此class對象對應類的指定名稱的成員變數,與成員變數訪問許可權無關

:返回此class對象對應類的全部成員變數,與成員變數的訪問許可權無關

獲取類註解

:嘗試獲取該class對象對應類上村子的指定類型的Annotation,如果該類型註解不存在,則返回null

:這是Java 8中新增的,該方法獲取直接修飾該class對象對應類的指定類型的Annotation,如果不存在,則返回null

:返回修飾該class對象對應類上存在的所有Annotation

:返回修飾該Class對象對應類上存在的所有Annotation

:該方法的功能與前面介紹的getAnnotation()方法基本相似,但由於Java8增加了重複註解功能,因此需要使用該方法獲取修飾該類的指定類型的多個Annotation

:該方法發功能與前面介紹的getDeclaredAnnotations()方法相似,也是因為Java8的重複註解的功能,需要使用該方法獲取直接修飾該類的指定類型的多個Annotation

獲取該類內部類

:返回該class隊形對應類里包含的全部內部類

獲取該類對象所在的外部類

:返回該Class對象對應類所在的外部類

獲取該類對象對應類所實現的介面

:返回該Class對象對應類所實現的全部介面

獲取該類對象對應類所繼承的父類

:返回該Class對象對應類的超類的Class對象

獲取該類對象對應類的修飾符、所在包、類名等基本信息

:返回此類或介面的所有修飾符,修飾符由public、protected、private、final、static、abstract等對應的常量組成,返回的整數應使用Modifier工具類的方法來解碼,才可以獲取真是的修飾符

:獲取該類的包

:以字元串形式返回此CLass對象所表示的類的簡稱

判斷該類是否為介面、枚舉、註解類型

:返回此class對象是否表示一個註解類型

:判斷此Class對象是否使用類Annotation修飾

:返回此class對象是否是一個匿名類

:返回此class對象是否表示一個數組類

:返回此class對象是否表示一個枚舉

:返回此class對象是否表示一個介面

:判斷obj是否是此class對象的實例,該方法可以完全代替instanceof操作符

public interface Colorable { public void value();}

public abstract void com.em.Colorable.value()falsetrue

Java8中新增的方法參數反射

:獲取該構造器或方法的形參個數

:獲取該構造器或方法的所有形參

:獲取修飾該形參的修飾符

:獲取形參名

:獲取帶泛型的形參類型

:獲取形參類型

:該方法返回該類的class文件中是否包含了方法的形參名信息

:該方法用於判斷該參數是否為個數可變的形參

public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class cls=Test.class; Method med=cls.getMethod("getInfo", String.class,List.class); System.out.println(med.getParameterCount()); Parameter[] params=med.getParameters(); System.out.println(params.length); for(Parameter par:params){ System.out.println(par.getName()); System.out.println(par.getType()); System.out.println(par.getParameterizedType()); } }}

22arg0class java.lang.Stringclass java.lang.Stringarg1interface java.util.Listjava.util.List

反射生成對象

使用Class對象的newInstance()方法創建Class對象的實例,該方法要求要有默認構造器(比較常用)

先使用Class對象獲取指定的Constructor對象,在調用Constructor對象的newInstance()方法來創建該Class對象對應類的實例

反射調用方法

:該方法中的obj是執行該方法的主調,後面的args是執行該方法時傳入該方法的實參

public class ClassInfo { public static void main(String[] args) throws Exception { Class cls=Test.class; Constructorconstruct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getMethod("getInfo", String.class); med.invoke(test, "調用方法成功"); }}

初始化調用方法成功

接下來看官仔細看下面的栗子

public class Test { public Test(String str) { System.out.println(str); } //私有方法 private void getInfo(String str){ System.out.println(str); }}

public class ClassInfo { public static void main(String[] args) throws Exception { Class cls=Test.class; Constructorconstruct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); //為啥使用這個方法呢? Method med=cls.getDeclaredMethod("getInfo", String.class); //為啥使用這個方法呢? med.setAccessible(true); med.invoke(test, "調用方法成功"); }}

初始化調用方法成功

setAccessible(boolean flag):將值設為true,指示該Method在使用是應該取消Java語言的訪問許可權檢查

訪問成員變數值

:獲取obj對象的該成員變數的值。此處的Xxx對應8種基本類型,如果該成員變數的類型是引用類型的,則去掉Xxx部分

:將obj對象的該成員變數設置為val值。此處的Xxx對應8中基本類型,如果該成員變數的類型是引用類型,則取消set後面的Xxx

以上兩個方法可以方法所有的成員變數,包括private的私有成員變數

public class ClassInfo { public static void main(String[] args) throws Exception { Class cls=Test.class; Constructorconstruct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getDeclaredMethod("getInfo", String.class); med.setAccessible(true); med.invoke(test, "調用方法成功"); Field fld=cls.getDeclaredField("num"); fld.setAccessible(true); fld.setInt(test, 12); System.out.println(fld.getInt(test)); }}

初始化調用方法成功12

操作數組

:創建一個具有指定的元素類型、指定維度的新數組

:返回array數組中第index個元素。其中xxx是各種基本數據類型,如果數組元素是引用類型,則該方法變為get()

:將array數組中低index 個元素的值設為val,其中xxx是各種基本數據類型,如果數組元素是引用類型,則該方法變為set()


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

java技術團隊必須要注意的那幾個點
給初學者的建議 中
給java初學者建議 下-1
熟悉java三大框架的作用
揭秘Java中的 面向對象模型

TAG:java學習吧 |

您可能感興趣

利用fastjson反序列化json為對象和對象數組
Kotlin 類和對象
code值獲取內部枚舉類對象(自定義EnumUtil PackageUtil工具類)
Secret 資源對象的使用
Python列印對象的全部屬性
簡單定義Python和Scala的類和對象
C++對象的使用:四種對象生存期和作用域、static 用法總結
Python對象真值判定邏輯粗解與簡明例子
如何針對Windows中ConsoleWindowClass對象實現進程注入
Oracle資料庫——Oracle事務和常用數據對象優化
使用TensorFlow對象檢測介面標註數據集
如何使用Tensorflow對象檢測進行像素級分類?
Facebook的AI能讓你把視頻中的人變成3D交互對象
Web Pages Database 對象
rtfraptor:從惡意RTF文件中提取OLEv1對象的工具
歐盟官員:Libra將成反壟斷監管機構重點關注對象
ASP Drive 對象
符合 Python 風格的對象
不打開文件獲取名稱。Excel VBA Application對象GetOpenFilename方法教程
Adobe為After Effects 加入移除視頻中多餘對象的功能