Java通過反射查看類的信息示例
本文實例講述了Java通過反射查看類的信息。分享給大家供大家參考,具體如下:
一 點睛
1 通過反射獲取Class對象
使用Class類的forName()靜態(tài)方法。該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個類的全限定類名(必須添加完整包名)。
調(diào)用某個類的class屬性來獲取該類對應(yīng)的Class對象。例如Person.class將會返回Person類對應(yīng)的Class對象。
調(diào)用某個對象的getClass()方法,該方法是java.lang.Object類中的一個方法,所以所有Java對象都可以調(diào)用該方法,該方法將會返回該對象所屬類對應(yīng)的Class對象。
2 從Class中獲取信息
獲取構(gòu)造器
訪問Class對應(yīng)的類所包含的方法
訪問Class對應(yīng)的類所包含的屬性(Field)
訪問Class對應(yīng)的類上所包含的注釋。
訪問該Class對象對應(yīng)類包含的內(nèi)部類。
訪問該Class對象對應(yīng)類所在的外部類。
訪問該Class對象所對應(yīng)類所繼承的父類、所實現(xiàn)的接口等。
二 實戰(zhàn)
1 代碼
import java.util.*; import java.lang.reflect.*; import java.lang.annotation.*; // 定義可重復(fù)注解 @Repeatable(Annos.class) @interface Anno { } @Retention(value = RetentionPolicy.RUNTIME) @interface Annos { Anno[] value(); } // 使用4個注解修飾該類 @SuppressWarnings(value = "unchecked") @Deprecated // 使用重復(fù)注解修飾該類 @Anno @Anno public class ClassTest { // 為該類定義一個私有的構(gòu)造器 private ClassTest() { } // 定義一個有參數(shù)的構(gòu)造器 public ClassTest( String name ) { System.out.println("執(zhí)行有參數(shù)的構(gòu)造器"); } // 定義一個無參數(shù)的info方法 public void info() { System.out.println("執(zhí)行無參數(shù)的info方法"); } // 定義一個有參數(shù)的info方法 public void info( String str ) { System.out.println("執(zhí)行有參數(shù)的info方法" + ",其str參數(shù)值:" + str); } // 定義一個測試用的內(nèi)部類 class Inner { } public static void main( String[] args ) throws Exception { // 下面代碼可以獲取ClassTest對應(yīng)的Class Class<ClassTest> clazz = ClassTest.class; // 獲取該Class對象所對應(yīng)類的全部構(gòu)造器 Constructor[] ctors = clazz.getDeclaredConstructors(); System.out.println("ClassTest的全部構(gòu)造器如下:"); for (Constructor c : ctors) { System.out.println(c); } // 獲取該Class對象所對應(yīng)類的全部public構(gòu)造器 Constructor[] publicCtors = clazz.getConstructors(); System.out.println("ClassTest的全部public構(gòu)造器如下:"); for (Constructor c : publicCtors) { System.out.println(c); } // 獲取該Class對象所對應(yīng)類的全部public方法 Method[] mtds = clazz.getMethods(); System.out.println("ClassTest的全部public方法如下:"); for (Method md : mtds) { System.out.println(md); } // 獲取該Class對象所對應(yīng)類的指定方法 System.out.println("ClassTest里帶一個字符串參數(shù)的info()方法為:" + clazz.getMethod("info", String.class)); // 獲取該Class對象所對應(yīng)類的上的全部注解 Annotation[] anns = clazz.getAnnotations(); System.out.println("ClassTest的全部Annotation如下:"); for (Annotation an : anns) { System.out.println(an); } System.out.println("該Class元素上的@SuppressWarnings注解為:" + Arrays.toString(clazz.getAnnotationsByType(SuppressWarnings.class))); System.out.println("該Class元素上的@Anno注解為:" + Arrays.toString(clazz.getAnnotationsByType(Anno.class))); // 獲取該Class對象所對應(yīng)類的全部內(nèi)部類 Class<?>[] inners = clazz.getDeclaredClasses(); System.out.println("ClassTest的全部內(nèi)部類如下:"); for (Class c : inners) { System.out.println(c); } // 使用Class.forName方法加載ClassTest的Inner內(nèi)部類 Class inClazz = Class.forName("ClassTest$Inner"); // 通過getDeclaringClass()訪問該類所在的外部類 System.out.println("inClazz對應(yīng)類的外部類為:" + inClazz.getDeclaringClass()); System.out.println("ClassTest的包為:" + clazz.getPackage()); System.out.println("ClassTest的父類為:" + clazz.getSuperclass()); } }
2 運行
ClassTest的全部構(gòu)造器如下:
private ClassTest()
public ClassTest(java.lang.String)
ClassTest的全部public構(gòu)造器如下:
public ClassTest(java.lang.String)
ClassTest的全部public方法如下:
public static void ClassTest.main(java.lang.String[]) throws java.lang.Exception
public void ClassTest.info(java.lang.String)
public void ClassTest.info()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
ClassTest里帶一個字符串參數(shù)的info()方法為:public void ClassTest.info(java.lang.String)
ClassTest的全部Annotation如下:
@java.lang.Deprecated()
@Annos(value=[@Anno(), @Anno()])
該Class元素上的@SuppressWarnings注解為:[]
該Class元素上的@Anno注解為:[@Anno(), @Anno()]
ClassTest的全部內(nèi)部類如下:
class ClassTest$Inner
inClazz對應(yīng)類的外部類為:class ClassTest
ClassTest的包為:null
ClassTest的父類為:class java.lang.Object
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Mybatis基于MapperScan注解的動態(tài)代理加載機制詳解
這篇文章主要介紹了Mybatis基于MapperScan注解的動態(tài)代理加載機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01SpringBoot集成JWT實現(xiàn)Token登錄驗證的示例代碼
隨著技術(shù)的發(fā)展,分布式web應(yīng)用的普及,通過session管理用戶登錄狀態(tài)成本越來越高,因此慢慢發(fā)展成為token的方式做登錄身份校驗,本文就來介紹一下SpringBoot集成JWT實現(xiàn)Token登錄驗證的示例代碼,感興趣的可以了解一下2023-12-12在啟動后臺 jar包時,使用指定的 application.yml操作
這篇文章主要介紹了在啟動后臺 jar包時,使用指定的 application.yml操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10Spring AOP + 注解實現(xiàn)統(tǒng)一注解功能
本文我們通過Spring AOP和Java的自定義注解來實現(xiàn)日志的插入功能,非常不錯,具有一定的參考借鑒價值,需要的朋友一起看看吧2018-05-05java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案
這篇文章主要介紹了java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08詳解SpringBoot 應(yīng)用如何提高服務(wù)吞吐量
這篇文章主要介紹了Spring Boot 應(yīng)用如何提高服務(wù)吞吐量,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07