首页 课程 师资 教程 报名

Java通过反射查看类的信息示例

  • 2019-08-26 13:51:50
  • 1948次 动力节点



今天动力节点java学院小编为大家介绍Java通过反射查看类的信息,希望各位小伙伴看完此文,对你们有很大的帮助,下面各位小伙伴们就随小编一起看看Java通过反射查看类的信息吧。


  一、 点睛


  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


@Anno


public 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 {


    Classclazz = 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.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里带一个字符串参数的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$Inner


inClazz对应类的外部类为:class ClassTest


ClassTest的包为:null


ClassTest的父类为:class java.lang.Object


以上就是动力节点java学院小编介绍的“Java通过反射查看类的信息示例”的内容,希望对各位小伙伴有帮助,更多java资讯内容,请继续关注动力节点java学院官网。



选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交