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初學者建議 下-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 加入移除視頻中多餘對象的功能