Java通過反射查看類的信息示例
本文實例講述了Java通過反射查看類的信息。分享給大家供大家參考,具體如下:
一 點睛
1 通過反射獲取Class對象
使用Class類的forName()靜態(tài)方法。該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個類的全限定類名(必須添加完整包名)。
調(diào)用某個類的class屬性來獲取該類對應的Class對象。例如Person.class將會返回Person類對應的Class對象。
調(diào)用某個對象的getClass()方法,該方法是java.lang.Object類中的一個方法,所以所有Java對象都可以調(diào)用該方法,該方法將會返回該對象所屬類對應的Class對象。
2 從Class中獲取信息
獲取構造器
訪問Class對應的類所包含的方法
訪問Class對應的類所包含的屬性(Field)
訪問Class對應的類上所包含的注釋。
訪問該Class對象對應類包含的內(nèi)部類。
訪問該Class對象對應類所在的外部類。
訪問該Class對象所對應類所繼承的父類、所實現(xiàn)的接口等。
二 實戰(zhàn)
1 代碼
import java.util.*;
import java.lang.reflect.*;
import java.lang.annotation.*;
// 定義可重復注解
@Repeatable(Annos.class)
@interface Anno {
}
@Retention(value = RetentionPolicy.RUNTIME)
@interface Annos {
Anno[] value();
}
// 使用4個注解修飾該類
@SuppressWarnings(value = "unchecked")
@Deprecated
// 使用重復注解修飾該類
@Anno
@Anno
public class ClassTest {
// 為該類定義一個私有的構造器
private ClassTest() {
}
// 定義一個有參數(shù)的構造器
public ClassTest( String name ) {
System.out.println("執(zhí)行有參數(shù)的構造器");
}
// 定義一個無參數(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對應的Class
Class<ClassTest> clazz = ClassTest.class;
// 獲取該Class對象所對應類的全部構造器
Constructor[] ctors = clazz.getDeclaredConstructors();
System.out.println("ClassTest的全部構造器如下:");
for (Constructor c : ctors) {
System.out.println(c);
}
// 獲取該Class對象所對應類的全部public構造器
Constructor[] publicCtors = clazz.getConstructors();
System.out.println("ClassTest的全部public構造器如下:");
for (Constructor c : publicCtors) {
System.out.println(c);
}
// 獲取該Class對象所對應類的全部public方法
Method[] mtds = clazz.getMethods();
System.out.println("ClassTest的全部public方法如下:");
for (Method md : mtds) {
System.out.println(md);
}
// 獲取該Class對象所對應類的指定方法
System.out.println("ClassTest里帶一個字符串參數(shù)的info()方法為:"
+ clazz.getMethod("info", String.class));
// 獲取該Class對象所對應類的上的全部注解
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對象所對應類的全部內(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對應類的外部類為:" +
inClazz.getDeclaringClass());
System.out.println("ClassTest的包為:" + clazz.getPackage());
System.out.println("ClassTest的父類為:" + clazz.getSuperclass());
}
}
2 運行
ClassTest的全部構造器如下:
private ClassTest()
public ClassTest(java.lang.String)
ClassTest的全部public構造器如下:
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對應類的外部類為:class ClassTest
ClassTest的包為:null
ClassTest的父類為:class java.lang.Object
更多java相關內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
java使用webuploader實現(xiàn)跨域上傳詳解
目前初步接觸JAVA圖片上傳,用的webuploader。已經(jīng)跟后臺對接上,但是有個問題就是跨域請求,通過查找相關資料終于實現(xiàn)了,下面這篇文章主要給大家介紹了關于java使用webuploader實現(xiàn)跨域上傳的相關資料,需要的朋友可以參考下。2017-07-07
Java?zxing實現(xiàn)生成并解析二維碼與條形碼
這篇文章主要為大家詳細介紹了Java如何通過zxing實現(xiàn)生成并解析二維碼與條形碼,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2024-11-11
Java正則校驗密碼至少包含字母數(shù)字特殊符號中的2種實例代碼
正則表達式驗證密碼功能在項目中經(jīng)常被使用到,但是很多朋友還是不大會使用密碼正則表達式進行驗證,下面這篇文章主要給大家介紹了關于Java正則校驗密碼至少包含字母數(shù)字特殊符號中2種的相關資料,需要的朋友可以參考下2022-08-08
hadoop運行java程序(jar包)并運行時動態(tài)指定參數(shù)
這篇文章主要介紹了hadoop如何運行java程序(jar包)并運行時動態(tài)指定參數(shù),使用hadoop 運行 java jar包,Main函數(shù)一定要加上全限定類名,需要的朋友可以參考下2021-06-06
關于Spring Boot動態(tài)權限變更問題的實現(xiàn)方案
這篇文章主要介紹了Spring Boot動態(tài)權限變更實現(xiàn)的整體方案使用session作為緩存,結合AOP技術進行token認證和權限控制,本文給大家介紹的非常詳細,需要的朋友參考下吧2021-06-06
java中MultipartFile和File最簡單的互相轉換示例
這篇文章主要給大家介紹了關于java中MultipartFile和File最簡單的互相轉換的相關資料,MultipartFile和File都是Java中用于處理文件上傳的類,MultipartFile用于處理上傳的文件,File用于處理本地磁盤上的文件,需要的朋友可以參考下2023-09-09

