Java反射 - 类对象

简介: 使用Java反射,您可以在运行时检查Java类。在使用Reflection时,检查类往往是你做的第一件事。从课程中你可以获得有关的信息Class NameClass Modifies (public, private, synchronized etc.)Package InfoSuperclassImplemented InterfacesConstructorsMethodsFieldsAnnotations加上更多与Java类相关的信息。

使用Java反射,您可以在运行时检查Java类。在使用Reflection时,检查类往往是你做的第一件事。从课程中你可以获得有关的信息

  • Class Name
  • Class Modifies (public, private, synchronized etc.)
  • Package Info
  • Superclass
  • Implemented Interfaces
  • Constructors
  • Methods
  • Fields
  • Annotations
    加上更多与Java类相关的信息。有关完整列表,您应该查阅java.lang.Class的JavaDoc。本文将简要介绍如何访问上述信息。一些主题也将在单独的文本中进行更详细的审查。例如,这个文本将告诉你如何获得所有的方法或者一个特定的方法,但是一个单独的文本将告诉你如何调用这个方法,如果找到与给定的一组参数相匹配的方法,如果存在多个方法同名,通过反射从方法调用抛出什么异常,如何找到getter / setter等等。本文的目的主要是介绍Class对象和你可以从中获得的信息。

Class对象

在对类进行任何检查之前,您需要获取其java.lang.Class对象。 Java中的所有类型(包括数组的基本类型(int,long,float等))都有一个关联的Class对象。 如果你在编译时知道这个类的名字,你可以像这样获得一个Class对象:

  Class myObjectClass = MyObject.class

如果您在编译时不知道名称,但是在运行时将类名称作为字符串,则可以这样做:

String className = ... //在运行时获取类名字符串Class class = Class.forName(className);

使用Class.forName()方法时,您必须提供完全限定的类名称。 这是包括所有包名称的类名称。 例如,如果MyObject位于包com.fantj.refletion中,那么完全限定的类名是com.jenkov.myapp.MyObject

如果在运行时无法在类路径中找到该类,则Class.forName()方法可能会引发ClassNotFoundException。

Class 名

从一个Class对象中你可以得到两个版本的名字。 完全限定的类名(包括包名)是使用getName()方法获得的,如下所示:

    Class aClass = ... //obtain Class object. See prev. section
    String className = aClass.getName();

如果你想要没有包名称的类名,你可以使用getSimpleName()方法获得它,如下所示:

  Class  aClass          = ... //obtain Class object. See prev. section
  String simpleClassName = aClass.getSimpleName();

Modifiers 修改器堆栈(modifier的复数)

您可以通过Class对象访问类的修饰符。 类的修饰符是关键字 "public", "private", "static"等您可以获得这样的类修饰符:

  Class  aClass = ... //obtain Class object. See prev. section
  int modifiers = aClass.getModifiers();

修饰符被打包成一个int,其中每个修饰符都是一个标志位,可以被设置或清除。 您可以在类java.lang.reflect.Modifier中使用这些方法检查修饰符:

    Modifier.isAbstract(int modifiers)
    Modifier.isFinal(int modifiers)
    Modifier.isInterface(int modifiers)
    Modifier.isNative(int modifiers)
    Modifier.isPrivate(int modifiers)
    Modifier.isProtected(int modifiers)
    Modifier.isPublic(int modifiers)
    Modifier.isStatic(int modifiers)
    Modifier.isStrict(int modifiers)
    Modifier.isSynchronized(int modifiers)
    Modifier.isTransient(int modifiers)
    Modifier.isVolatile(int modifiers)

包信息

你可以像这样从一个Class对象中获得关于这个包的信息:

Class  aClass = ... //obtain Class object. See prev. section
Package package = aClass.getPackage();

从Package对象中可以获得有关包的信息,如名称。 您也可以在类路径中访问此程序包所在的JAR文件的Manifest文件中为此程序包指定的信息。 例如,您可以在Manifest文件中指定包版本号。 你可以在这里阅读关于Package类的更多信息:java.lang.Package

Superclass

从Class对象中可以访问类的父类。

Class superclass = aClass.getSuperclass();

父类的对象和其他类一样是一个Class对象,所以你可以继续对它进行类反射。

Implemented Interfaces

可以获得给定类实现的接口列表.

Class  aClass = ... //obtain Class object. See prev. section
Class[] interfaces = aClass.getInterfaces();

一个类可以实现多个接口。 因此返回一个Class数组。 接口也由Java Reflection中的Class对象表示。

注意:只有返回由特定类实现的接口。 如果这个类的父类实现了一个接口,但是这个类并没有明确说明它也实现了这个接口,那么这个接口将不会返回到这个数组中。 即使班级在实践中实现了这个接口,因为超类也是如此。

要获得由给定类实现的接口的完整列表,您将不得不递归地查阅类及其超类。

Constructors

你可以像这样访问一个类的构造函数:

 Constructor[] constructors = aClass.getConstructors();

构造函数在构造函数的文章中有更详细的介绍。Java反射--构造函数

Methods

你可以像这样访问一个类的方法:

 Method[] method = aClass.getMethods();

方法在方法文本中有更详细的介绍。Java反射 - 方法 Methods

Fields

你可以像这样访问类的字段(成员变量):

 Field[] method = aClass.getFields();

field在field文章中有更详细的介绍。Java反射 - 字段

Annotations 注解

您可以像这样访问类的类注解:

 Annotation[] annotations = aClass.getAnnotations();

注释文章中的注释更详细。Java反射 - 注解

项目代码:github链接

相关文章
|
10天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
31 6
|
1天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
5天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
31 17
|
3天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
3天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
4天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
7天前
|
Java
Java的原子变量类
Java的原子变量类
17 8
|
3天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
11 3
|
6天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
17 5
|
6天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
11 3