Java通過(guò)反射查看類(lèi)的信息示例

本文實(shí)例講述了Java通過(guò)反射查看類(lèi)的信息。分享給大家供大家參考,具體如下:

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),瑞安網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:瑞安等地區(qū)。瑞安做網(wǎng)站價(jià)格咨詢(xún):13518219792

一 點(diǎn)睛

1 通過(guò)反射獲取Class對(duì)象

使用Class類(lèi)的forName()靜態(tài)方法。該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個(gè)類(lèi)的全限定類(lèi)名(必須添加完整包名)。

調(diào)用某個(gè)類(lèi)的class屬性來(lái)獲取該類(lèi)對(duì)應(yīng)的Class對(duì)象。例如Person.class將會(huì)返回Person類(lèi)對(duì)應(yīng)的Class對(duì)象。

調(diào)用某個(gè)對(duì)象的getClass()方法,該方法是java.lang.Object類(lèi)中的一個(gè)方法,所以所有Java對(duì)象都可以調(diào)用該方法,該方法將會(huì)返回該對(duì)象所屬類(lèi)對(duì)應(yīng)的Class對(duì)象。

2 從Class中獲取信息

獲取構(gòu)造器

訪(fǎng)問(wèn)Class對(duì)應(yīng)的類(lèi)所包含的方法

訪(fǎng)問(wèn)Class對(duì)應(yīng)的類(lèi)所包含的屬性(Field)

訪(fǎng)問(wèn)Class對(duì)應(yīng)的類(lèi)上所包含的注釋。

訪(fǎng)問(wèn)該Class對(duì)象對(duì)應(yīng)類(lèi)包含的內(nèi)部類(lèi)。

訪(fǎng)問(wèn)該Class對(duì)象對(duì)應(yīng)類(lèi)所在的外部類(lèi)。

訪(fǎng)問(wèn)該Class對(duì)象所對(duì)應(yīng)類(lèi)所繼承的父類(lèi)、所實(shí)現(xiàn)的接口等。

二 實(shí)戰(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個(gè)注解修飾該類(lèi)
@SuppressWarnings(value = "unchecked")
@Deprecated
// 使用重復(fù)注解修飾該類(lèi)
@Anno
@Anno
public class ClassTest {
  // 為該類(lèi)定義一個(gè)私有的構(gòu)造器
  private ClassTest() {
  }
  // 定義一個(gè)有參數(shù)的構(gòu)造器
  public ClassTest( String name ) {
    System.out.println("執(zhí)行有參數(shù)的構(gòu)造器");
  }
  // 定義一個(gè)無(wú)參數(shù)的info方法
  public void info() {
    System.out.println("執(zhí)行無(wú)參數(shù)的info方法");
  }
  // 定義一個(gè)有參數(shù)的info方法
  public void info( String str ) {
    System.out.println("執(zhí)行有參數(shù)的info方法"
        + ",其str參數(shù)值:" + str);
  }
  // 定義一個(gè)測(cè)試用的內(nèi)部類(lèi)
  class Inner {
  }
  public static void main( String[] args )
      throws Exception {
    // 下面代碼可以獲取ClassTest對(duì)應(yīng)的Class
    Class<ClassTest> clazz = ClassTest.class;
    // 獲取該Class對(duì)象所對(duì)應(yīng)類(lèi)的全部構(gòu)造器
    Constructor[] ctors = clazz.getDeclaredConstructors();
    System.out.println("ClassTest的全部構(gòu)造器如下:");
    for (Constructor c : ctors) {
      System.out.println(c);
    }
    // 獲取該Class對(duì)象所對(duì)應(yīng)類(lèi)的全部public構(gòu)造器
    Constructor[] publicCtors = clazz.getConstructors();
    System.out.println("ClassTest的全部public構(gòu)造器如下:");
    for (Constructor c : publicCtors) {
      System.out.println(c);
    }
    // 獲取該Class對(duì)象所對(duì)應(yīng)類(lèi)的全部public方法
    Method[] mtds = clazz.getMethods();
    System.out.println("ClassTest的全部public方法如下:");
    for (Method md : mtds) {
      System.out.println(md);
    }
    // 獲取該Class對(duì)象所對(duì)應(yīng)類(lèi)的指定方法
    System.out.println("ClassTest里帶一個(gè)字符串參數(shù)的info()方法為:"
        + clazz.getMethod("info", String.class));
    // 獲取該Class對(duì)象所對(duì)應(yīng)類(lèi)的上的全部注解
    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對(duì)象所對(duì)應(yīng)類(lèi)的全部?jī)?nèi)部類(lèi)
    Class<?>[] inners = clazz.getDeclaredClasses();
    System.out.println("ClassTest的全部?jī)?nèi)部類(lèi)如下:");
    for (Class c : inners) {
      System.out.println(c);
    }
    // 使用Class.forName方法加載ClassTest的Inner內(nèi)部類(lèi)
    Class inClazz = Class.forName("ClassTest$Inner");
    // 通過(guò)getDeclaringClass()訪(fǎng)問(wèn)該類(lèi)所在的外部類(lèi)
    System.out.println("inClazz對(duì)應(yīng)類(lèi)的外部類(lèi)為:" +
        inClazz.getDeclaringClass());
    System.out.println("ClassTest的包為:" + clazz.getPackage());
    System.out.println("ClassTest的父類(lèi)為:" + clazz.getSuperclass());
  }
}

2 運(yùn)行

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里帶一個(gè)字符串參數(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的全部?jī)?nèi)部類(lèi)如下:
class ClassTest$Inner
inClazz對(duì)應(yīng)類(lèi)的外部類(lèi)為:class ClassTest
ClassTest的包為:null
ClassTest的父類(lèi)為:class java.lang.Object

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

網(wǎng)站題目:Java通過(guò)反射查看類(lèi)的信息示例
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article46/ghipeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)服務(wù)器托管、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)