摘要:使用反射可以在運(yùn)行時檢視類。類名類修飾符等包信息超類所實(shí)現(xiàn)的接口構(gòu)造函數(shù)方法屬性注解類中附加了很多信息,你可以在獲得一個完整列表。全限定名包含所有的包名。構(gòu)造函數(shù)你可以訪問類的構(gòu)造函數(shù),代碼如下構(gòu)造函數(shù)的詳細(xì)教程在章節(jié)。
使用反射可以在運(yùn)行時檢視Java類。檢視類通常是使用反射時所做的第一件事情。從類中可以獲得下面的信息。
類名
類修飾符(private、public、synchronized等)
包信息
超類
所實(shí)現(xiàn)的接口
構(gòu)造函數(shù)
方法
屬性
注解
Java類中附加了很多信息,你可以在JavaDoc for java.lang.Class獲得一個完整列表。本文將簡要接觸訪問所有上述提到的信息。一些主題會在分章節(jié)中進(jìn)行更詳細(xì)的檢查。例如,本文會展示如何獲得所有的方法或者一個具體的方法,但分章節(jié)會展示如何調(diào)用那個方法、如何在名稱相同的方法中匹配一個給定參數(shù)集合的方法、通過反射調(diào)用方法將拋出什么異常、如何發(fā)現(xiàn)一個get/set等。本文的主要目的是介紹Class對象和你通過它能獲得的信息。
Class對象對類做任何檢視之前,必須先獲得所檢視類的java.lang.Class對象。包括所有原始類型(int、float、lang等)包括數(shù)組(arrays)等所有Java類型都擁有一個相關(guān)的Class對象。如果你知道類在編譯時的名稱,可以通過下面的代碼獲得它的Class對象:
Class myObjectClass = MyObject.class
如果你不知道類在編譯時的名稱,但知道類在運(yùn)行時的名稱字符串,可以參考下面的代碼:
String className = ... //obtain class name as string at runtime Class class = Class.forName(className);
當(dāng)使用Class.forName()方法時,你必須提供類的全限定名。全限定名包含所有的包名。例如,如果MyObject位于包com.jenkov.myapp,那么它的全限定名是com.jenkov.myapp.MyObject。
Class.forName() 方法在運(yùn)行時classpath路徑下找不到類時,會拋出一個ClassNotFoundException異常。
Class對象包含兩個版本的名稱。全限定名(包含包名)使用getName()方法,如下:
Class aClass = ... //obtain Class object. See prev. section String className = aClass.getName();
如果你需要獲得不包含報名的類名稱,你可以使用 getSimpleName()方法獲得,如下:
Class aClass = ... //obtain Class object. See prev. section String simpleClassName = aClass.getSimpleName();修飾符
你可以通過Class對象訪問一個類的修飾符。類修飾符關(guān)鍵字為public、private 、static等。獲得類修飾符的代碼如下:
Class aClass = ... //obtain Class object. See prev. section int modifiers = aClass.getModifiers();
修飾符被包裝成int,每個修飾符都是一個標(biāo)識位來標(biāo)記設(shè)置或清除。你可以通過java.lang.reflect.Modifier類的下列方法檢查修飾符:
Modifier.isAbstract(int modifiers) Modifier.isFinal(int modifiers) Modifier.isInterface(int modifiers) Modifier.isNative(int modifiers) Modifier.isPrivate(int modifiers) Modifier.isProtected(int modifiers) Modifier.isPublic(int modifiers) Modifier.isStatic(int modifiers) Modifier.isStrict(int modifiers) Modifier.isSynchronized(int modifiers) Modifier.isTransient(int modifiers) Modifier.isVolatile(int modifiers)包信息
你可以通過下面的方法獲得包信息:
Class aClass = ... //obtain Class object. See prev. section Package package = aClass.getPackage();
你可以通過Package對象獲取包信息,比如包名。你也可以訪問位于classpath路徑下的jar下的Manifest文件中的包的明確定義的包信息。例如,你可以在Manifest文件中指定包的版本號。你可以在 java.lang.Package中訪問更詳細(xì)的Package對象的信息。
超類從Class對象中你可以訪問類的超類。代碼如下:
Class superclass = aClass.getSuperclass();
超類對象也是一個普通的Class對象,所以你可以對它進(jìn)行反射操作。
實(shí)現(xiàn)的接口我們可以獲得一個給定類的實(shí)現(xiàn)的接口的列表。代碼如下:
Class aClass = ... //obtain Class object. See prev. section Class[] interfaces = aClass.getInterfaces();
一個類可以實(shí)現(xiàn)多個接口,因此返回值是一個Class數(shù)組。在反射中,接口也以Class對象表示。
注意:只有類顯示實(shí)現(xiàn)的接口才返回。如果一個類的超類實(shí)現(xiàn)了一個接口,但是這個類沒有實(shí)現(xiàn),超類實(shí)現(xiàn)的接口不會包含在返回的數(shù)組中。即使這個類實(shí)際實(shí)現(xiàn)了那個接口(超類直接實(shí)現(xiàn)的接口),因?yàn)樗浅悓?shí)現(xiàn)的。
如果需要獲得一個類實(shí)現(xiàn)的完整接口列表,你必須遞歸這個類和它所有的超類。
你可以訪問類的構(gòu)造函數(shù),代碼如下:
Constructor[] constructors = aClass.getConstructors();
構(gòu)造函數(shù)的詳細(xì)教程在Constructors章節(jié)。
方法你可以訪問類的方法,代碼如下:
Method[] method = aClass.getMethods();
方法的更詳盡教程在Methods章節(jié)。
屬性你可以訪問類的屬性(成員變量),代碼如下:
Field[] method = aClass.getFields();
屬性的更詳盡教程在Fields章節(jié)。
注解你可以訪問一個類的注解,代碼如下:
Annotation[] annotations = aClass.getAnnotations();
注解的更詳盡教程在Annotations章節(jié)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77169.html
摘要:反射機(jī)制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識。反射的概念反射是一種在運(yùn)行時獲取以及修改應(yīng)用行為的一種工具。因?yàn)榉瓷湫枰獎討B(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運(yùn)行時權(quán)限,在特定的安全環(huán)境下不一定存在。 Java反射機(jī)制(一) 結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識。結(jié)尾篇補(bǔ)一個小例子。 主要內(nèi)容 這次博客的主要內(nèi)容就是簡...
摘要:反射機(jī)制的應(yīng)用實(shí)例在泛型為的中存放一個類型的對象。工廠模式可以參考現(xiàn)在我們利用反射機(jī)制實(shí)現(xiàn)工廠模式,可以在不修改工廠類的情況下添加任意多個子類。 學(xué)習(xí)交流群:669823128java 反射 定義 功能 示例概要:Java反射機(jī)制詳解| |目錄 1反射機(jī)制是什么 2反射機(jī)制能做什么 3反射機(jī)制的相關(guān)API 通過一個對象獲得完整的包名和類名 實(shí)例化Class類對象 獲取一個對象的父類與...
摘要:反射使用類對象提供的基本元數(shù)據(jù),能從類對象中找出方法或字段的名稱,然后獲取表示方法或字段的對象。常見的反射手段有反射和反射。以之前的反射為例其中指定了方法的返回類型,其實(shí)不止如此。 Java反射機(jī)制主要提供了以下功能: 在運(yùn)行時判斷任意一個對象所屬的類 在運(yùn)行時構(gòu)造任意一個類的對象 在運(yùn)行時判斷任意一個類所具有的成員變量和方法 在運(yùn)行時調(diào)用任意一個對象的方法 生成動態(tài)代理 很多框架...
摘要:通過反射獲取帶參無返回值成員方法并使用設(shè)置安全檢查,訪問私有構(gòu)造函數(shù)必須創(chuàng)建實(shí)例這種不行,注意和方法需要傳遞參數(shù)測試復(fù)制這個功能獲取私有方法,同樣注意和的區(qū)別賦予訪問權(quán)限調(diào)用方法。 反射 目錄介紹 1.反射概述 1.1 反射概述 1.2 獲取class文件對象的三種方式 1.3 反射常用的方法介紹 1.4 反射的定義 1.5 反射的組成 1.6 反射的作用有哪些 2.反射的...
摘要:一反射機(jī)制概念程序運(yùn)行時,允許改變程序結(jié)構(gòu)或變量類型,這種語言稱為動態(tài)語言,如,是動態(tài)語言顯然,,不是動態(tài)語言,但是有著一個非常突出的動態(tài)相關(guān)機(jī)制。相關(guān)的為二獲取源頭重點(diǎn)打開權(quán)限所有類的對象其實(shí)都是的實(shí)例。 一、Java反射機(jī)制概念 程序運(yùn)行時,允許改變程序結(jié)構(gòu)或變量類型,這種語言稱為動態(tài)語言,如Python, Ruby是動態(tài)語言;顯然C++,Java,C#不是動態(tài)語言,但是JAVA有...
閱讀 3085·2019-08-30 15:56
閱讀 1239·2019-08-29 15:20
閱讀 1577·2019-08-29 13:19
閱讀 1484·2019-08-29 13:10
閱讀 3388·2019-08-26 18:27
閱讀 3074·2019-08-26 11:46
閱讀 2238·2019-08-26 11:45
閱讀 3766·2019-08-26 10:12