Java中怎么通过反射查看类的信息
创始人
2024-12-22 02:22:04
0次

一 点睛

1 通过反射获取Class对象

使用Class类的forName()静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名)。

调用某个类的class属性来获取该类对应的Class对象。例如Person.class将会返回Person类对应的Class对象。

调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。

2 从Class中获取信息

获取构造器

访问Class对应的类所包含的方法

访问Class对应的类所包含的属性(Field)

访问Class对应的类上所包含的注释。

访问该Class对象对应类包含的内部类。

访问该Class对象对应类所在的外部类。

访问该Class对象所对应类所继承的父类、所实现的接口等。

二 实战

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@Annopublic class ClassTest {  // 为该类定义一个私有的构造器  private ClassTest() {  }  // 定义一个有参数的构造器  public ClassTest( String name ) {    System.out.println("执行有参数的构造器");  }  // 定义一个无参数的info方法  public void info() {    System.out.println("执行无参数的info方法");  }  // 定义一个有参数的info方法  public void info( String str ) {    System.out.println("执行有参数的info方法"        + ",其str参数值:" + str);  }  // 定义一个测试用的内部类  class Inner {  }  public static void main( String[] args )      throws Exception {    // 下面代码可以获取ClassTest对应的Class    Class 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里带一个字符串参数的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对象所对应类的全部内部类    Class[] inners = clazz.getDeclaredClasses();    System.out.println("ClassTest的全部内部类如下:");    for (Class c : inners) {      System.out.println(c);    }    // 使用Class.forName方法加载ClassTest的Inner内部类    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.Exceptionpublic void ClassTest.info(java.lang.String)public void ClassTest.info()public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic 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里带一个字符串参数的info()方法为:public void ClassTest.info(java.lang.String)ClassTest的全部Annotation如下:@java.lang.Deprecated()@Annos(value=[@Anno(), @Anno()])该Class元素上的@SuppressWarnings注解为:[]该Class元素上的@Anno注解为:[@Anno(), @Anno()]ClassTest的全部内部类如下:class ClassTest$InnerinClazz对应类的外部类为:class ClassTestClassTest的包为:nullClassTest的父类为:class java.lang.Object

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...