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