java 反射机制详解及实例代码

Java反射机制详解

Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。

反射机制的特性

Java反射机制具有以下特性:

  • 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属性、注解等。
  • 动态性:反射机制可以在运行时动态创建对象、调用方法、访问属性。
  • 开发便利性:反射机制可以实现JavaBean操作、框架开发、ORM映射等功能,提高开发效率。

反射机制的基本使用

Java反射机制的主要类有Class、Constructor、Method、Field、Annotation等。

  1. 获取Class对象

使用Java反射机制,需要先获取Class对象,有以下三种方式:

  • 通过类名获取:Class.forName("com.example.User");
  • 通过类实例获取:user.getClass();
  • 通过类字面常量获取:User.class。
Class<User> userClass = User.class;
  1. 创建对象

Java反射机制可以动态创建对象,有以下两种方式:

  • 调用无参构造方法:Class.newInstance()。
  • 调用带参构造方法:Constructor.newInstance(args...)。
// 调用无参构造方法
User user1 = userClass.newInstance();

// 调用有参构造方法
Constructor<User> constructor = userClass.getConstructor(String.class, Integer.class);
User user2 = constructor.newInstance("Tom", 18);
  1. 调用方法

反射机制可以动态调用方法,有以下两种方式:

  • 调用无参方法:Method.invoke(obj)。
  • 调用有参方法:Method.invoke(obj, args...)。
// 调用无参方法
Method getNameMethod = userClass.getMethod("getName");
String name = (String) getNameMethod.invoke(user1);

// 调用有参方法
Method setNameMethod = userClass.getMethod("setName", String.class);
setNameMethod.invoke(user1, "Jack");
  1. 访问属性

反射机制可以动态访问属性,有以下两种方式:

  • 直接获取属性值:Field.get(obj)。
  • 直接设置属性值:Field.set(obj, value)。
// 直接获取属性值
Field ageField = userClass.getDeclaredField("age");
ageField.setAccessible(true);
int age = ageField.getInt(user1);

// 直接设置属性值
ageField.setInt(user1, 20);
  1. 获取注解

反射机制可以获取类、方法、属性的注解,有以下两种方式:

  • 获取单个注解:Class.getAnnotation、Method.getAnnotation、Field.getAnnotation。
  • 获取所有注解:Class.getDeclaredAnnotations、Method.getDeclaredAnnotations、Field.getDeclaredAnnotations。
// 获取类的注解
MyAnnotation classAnnotation = userClass.getAnnotation(MyAnnotation.class);

// 获取方法的注解
Method getNameMethod = userClass.getMethod("getName");
MyAnnotation methodAnnotation = getNameMethod.getAnnotation(MyAnnotation.class);

// 获取属性的注解
Field ageField = userClass.getDeclaredField("age");
MyAnnotation fieldAnnotation = ageField.getAnnotation(MyAnnotation.class);

反射机制的注意事项

  • 反射机制性能较低,在频繁调用时应尽量缓存Class对象,避免重复获取。
  • 反射机制获取的是运行时信息,编译期类型安全检查无法发挥作用,容易引发类型转换异常。
  • 反射机制不能访问私有方法和属性,需要通过setAccessible(true)设置可访问权限。

示例说明

以下两个示例分别演示了使用反射机制调用类的无参方法和有参方法。

public class UserService {
    public void sayHello() {
        System.out.println("Hello world!");
    }

    public void sayHi(String name) {
        System.out.println("Hi, " + name);
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        Class<UserService> userServiceClass = UserService.class;

        // 调用无参方法
        Method sayHelloMethod = userServiceClass.getMethod("sayHello");
        sayHelloMethod.invoke(userServiceClass.newInstance());

        // 调用有参方法
        Method sayHiMethod = userServiceClass.getMethod("sayHi", String.class);
        sayHiMethod.invoke(userServiceClass.newInstance(), "Tom");
    }
}

运行结果:

Hello world!
Hi, Tom

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 反射机制详解及实例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Maven中利用assembly插件打包jar包

    Maven是一个流行的项目管理工具,它可以简化Java项目的构建过程。而使用Maven中的assembly插件可以将多个依赖包以及其他文件打包到一个可执行的jar包中,这在一些项目中非常有用。下面是一个完整攻略,包含了示例和详细步骤。 1. 添加依赖 首先,需要在项目的Maven配置文件(pom.xml)中添加assembly插件和相关依赖。 <bui…

    Java 2023年5月19日
    00
  • Java获取文件路径常用方法解析

    获取文件路径是Java程序中经常用到的操作。常见的文件路径包括绝对路径和相对路径,本文将详细解析Java获取文件路径的常用方法。 1. 获取当前项目的绝对路径 我们可以通过以下代码获取当前项目的绝对路径: String projectPath = System.getProperty("user.dir"); 这种方式获取的路径是不包括文…

    Java 2023年5月20日
    00
  • java字符串格式化输出实例讲解

    Java字符串格式化输出实例讲解 在Java中,我们可以使用格式化字符串来控制输出的格式。使用格式化字符串可以让我们更加方便地输出值,并且可以让输出结果更加易读。 格式化字符串的语法 格式化字符串的语法为: System.out.printf(format, argument_list); 其中format是格式化字符串,argument_list是需要输出…

    Java 2023年5月26日
    00
  • 使用Maven中的scope总结

    使用Maven中的scope属性可以控制依赖关系的传递范围。scope有以下属性值: compile 依赖于当前项目的compile周期,该依赖会一直对所有周期都有效。默认值。 provided 只在编译和测试classpath中有用,但运行时不在classpath中。例如,servlet-api依赖可以设置为provided。在打包时不会将依赖项打入输出文…

    Java 2023年5月19日
    00
  • Spring Boot 2.0.0 终于正式发布-重大修订版本

    SpringBoot2.0.0终于正式发布-重大修订版本攻略 SpringBoot2.0.0是SpringBoot发布的一个重大修订版本,本次更新对整个Spring Framework进行了重构和升级,以适应更高效、更快速的应用程序开发。本文将详细介绍如何使用SpringBoot2.0.0,包括安装、创建项目、配置、测试以及示例代码。 安装 安装Spring…

    Java 2023年5月15日
    00
  • Kafka利用Java实现数据的生产和消费实例教程

    Kafka利用Java实现数据的生产和消费实例教程 Kafka是一个高性能的分布式消息队列,可以用于实现各种系统之间的异步通信以及数据流的处理。本文将介绍如何使用Java实现Kafka的数据生产和消费。以下是详细的步骤: 步骤一:安装和启动Kafka服务器 在开始使用Kafka之前,需要先安装Kafka服务器。Kafka服务器的安装过程可以参考Kafka官方…

    Java 2023年5月20日
    00
  • Java8新特性之深入解析日期和时间_动力节点Java学院整理

    Java8新特性之深入解析日期和时间_动力节点Java学院整理 为什么需要新的日期和时间API Java早期的日期和时间API出现了很多问题,如: API不一致:Java提供了大量日期和时间API,但它们之间的API不一致,这使得编写日期和时间代码非常困难。 可变性:Java早期的日期和时间API中的大多数类都是可变的,这意味着我们可以随时更改日期和时间,这…

    Java 2023年6月1日
    00
  • 总结十个Angular.js由浅入深的面试问题

    下面是关于“总结十个Angular.js由浅入深的面试问题”的完整攻略,包含两个示例说明。 总结十个Angular.js由浅入深的面试问题 Angular.js是一个非常流行的JavaScript框架,它可以帮助我们更加方便地构建现代化的Web应用程序。在面试中,Angular.js是一个非常常见的话题。本文将总结十个Angular.js由浅入深的面试问题,…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部