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日

相关文章

  • IDEA2022中部署Tomcat Web项目的流程分析

    下面是关于“IDEA2022中部署Tomcat Web项目的流程分析”的完整攻略: 1. 安装Tomcat 首先需要在本地安装Tomcat。在官网下载Tomcat安装包并进行安装。安装完成后,打开IDEA,进入“File -> Settings -> Build, Execution, Deployment -> Application S…

    Java 2023年6月2日
    00
  • Java超详细介绍抽象类与接口的使用

    Java超详细介绍抽象类与接口的使用 在Java语言中,抽象类和接口是两种重要的语法结构,它们可以用来描述一类对象所共有的特性和行为。本文将从定义、特点、使用场景、实现方式等多个方面,超详细地介绍抽象类和接口在Java中的使用。 抽象类的定义和特点 抽象类是一种特殊的类,它不能直接被实例化,只能用来作为其他类的基类。抽象类中包含了多个方法的定义,这些方法可以…

    Java 2023年5月26日
    00
  • 原来Java接口多实现还可以这样玩

    让我来详细讲解一下“原来Java接口多实现还可以这样玩”的完整攻略。在Java中,接口是一种特殊的类,它没有任何实现,只定义了一些方法的签名。Java中的一个类可以实现多个接口,而接口之间可以存在继承关系。这给我们带来了很多灵活的编程方式,下面是具体的攻略: 一、定义多个接口 首先我们需要定义多个接口,可以通过以下方式来定义两个接口。 public inte…

    Java 2023年5月18日
    00
  • SpringBoot Controller Post接口单元测试示例

    在Spring Boot应用程序中,我们可以使用Controller来处理HTTP请求。在编写Controller时,我们需要编写单元测试来确保Controller的正确性。本文将详细介绍如何编写Spring Boot Controller Post接口单元测试,并提供两个示例说明。 1. 编写Controller 在编写Controller时,我们需要定义…

    Java 2023年5月18日
    00
  • Sping Security前后端分离两种实战方案

    下面我将详细讲解“Spring Security前后端分离两种实战方案”的完整攻略。 简介 Spring Security 是一款开源的认证和授权框架,可以实现对系统的安全性保护。在前后端分离的架构中,Spring Security 的实现需要特别注意。本文将从两个方面介绍 Spring Security 的前后端分离实现方案。 方案一:基于 Token 的…

    Java 2023年6月3日
    00
  • Spring源码:Bean生命周期(三)

    前言 在之前的文章中,我们已经对 bean 的准备工作进行了讲解,包括 bean 定义和 FactoryBean 判断等。在这个基础上,我们可以更加深入地理解 getBean 方法的实现逻辑,并在后续的学习中更好地掌握createBean 方法的实现细节。 getBean用法 讲解getBean方法之前,我们先来看看他有几种常见的用法: // 创建一个Spr…

    Java 2023年5月4日
    00
  • NUXT SSR初级入门笔记(小结)

    NUXT SSR初级入门笔记(小结) 1. 什么是NUXT SSR NUXT SSR(Server-Side Rendering)是基于Vue.js的一个SSR框架。NUXT SSR可以将Vue组件实例渲染成HTML字符串,然后将这个HTML字符串响应给浏览器,从而让浏览器更快地呈现页面。通过NUXT SSR,可以提高页面的首屏渲染速度和SEO优化。 2. …

    Java 2023年6月15日
    00
  • spring mvc中@RequestBody注解的作用说明

    在 Spring MVC 中,@RequestBody 注解用于将 HTTP 请求体映射到一个对象上。本文将详细讲解 @RequestBody 注解的作用说明,并提供两个示例说明。 1. @RequestBody 注解的作用说明 @RequestBody 注解用于将 HTTP 请求体映射到一个对象上。当我们使用 @RequestBody 注解时,Spring…

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