Java通過反射查看類的信息示例

Java通過反射查看類的信息示例

深圳達內(nèi)教育      2022-04-01 06:10:01     20

Java通過反射查看類的信息示例,今天深圳達內(nèi)教育java學院小編為大家介紹Java通過反射查看類的信息,希望各位小伙伴看完此文,對你們有很大的幫助,下面各位小伙

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細介紹



今天深圳達內(nèi)教育java學院小編為大家介紹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 {


    Classclazz = 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


以上就是深圳達內(nèi)教育java學院小編介紹的“Java通過反射查看類的信息示例”的內(nèi)容,希望對各位小伙伴有幫助,更多java資訊內(nèi)容,請繼續(xù)關(guān)注深圳達內(nèi)教育java學院官網(wǎng)。



培訓啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹慎!任何要求預(yù)付定金、匯款等方式均存在風險,謹防上當。