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

 更新时间:2019年07月17日 08:40:06   作者:cakincqm  
这篇文章主要介绍了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 {
    // 下面代码可以获取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里带一个字符串参数的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操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • JavaSE的类和对象你真的了解吗

    JavaSE的类和对象你真的了解吗

    这篇文章主要为大家详细介绍了JavaSE的类和对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java设计模式之组合模式深入刨析

    Java设计模式之组合模式深入刨析

    组合模式,又叫部分整体模式,它创建了对象组的数据结构组合模式使得用户对单个对象和组合对象的访问具有一致性。本文将通过示例为大家详细介绍一下组合模式,需要的可以参考一下
    2022-05-05
  • java使用webuploader实现跨域上传详解

    java使用webuploader实现跨域上传详解

    目前初步接触JAVA图片上传,用的webuploader。已经跟后台对接上,但是有个问题就是跨域请求,通过查找相关资料终于实现了,下面这篇文章主要给大家介绍了关于java使用webuploader实现跨域上传的相关资料,需要的朋友可以参考下。
    2017-07-07
  • java元注解@Inherited的使用详解

    java元注解@Inherited的使用详解

    这篇文章主要介绍了java元注解@Inherited的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Java zxing实现生成并解析二维码与条形码

    Java zxing实现生成并解析二维码与条形码

    这篇文章主要为大家详细介绍了Java如何通过zxing实现生成并解析二维码与条形码,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-11-11
  • Java正则校验密码至少包含字母数字特殊符号中的2种实例代码

    Java正则校验密码至少包含字母数字特殊符号中的2种实例代码

    正则表达式验证密码功能在项目中经常被使用到,但是很多朋友还是不大会使用密码正则表达式进行验证,下面这篇文章主要给大家介绍了关于Java正则校验密码至少包含字母数字特殊符号中2种的相关资料,需要的朋友可以参考下
    2022-08-08
  • 基于Java 生产者消费者模式(详细分析)

    基于Java 生产者消费者模式(详细分析)

    下面小编就为大家分享一篇基于Java 生产者消费者模式(详细分析),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • hadoop运行java程序(jar包)并运行时动态指定参数

    hadoop运行java程序(jar包)并运行时动态指定参数

    这篇文章主要介绍了hadoop如何运行java程序(jar包)并运行时动态指定参数,使用hadoop 运行 java jar包,Main函数一定要加上全限定类名,需要的朋友可以参考下
    2021-06-06
  • 关于Spring Boot动态权限变更问题的实现方案

    关于Spring Boot动态权限变更问题的实现方案

    这篇文章主要介绍了Spring Boot动态权限变更实现的整体方案使用session作为缓存,结合AOP技术进行token认证和权限控制,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-06-06
  • java中MultipartFile和File最简单的互相转换示例

    java中MultipartFile和File最简单的互相转换示例

    这篇文章主要给大家介绍了关于java中MultipartFile和File最简单的互相转换的相关资料,MultipartFile和File都是Java中用于处理文件上传的类,MultipartFile用于处理上传的文件,File用于处理本地磁盘上的文件,需要的朋友可以参考下
    2023-09-09

最新评论