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日

相关文章

  • Redis分布式锁这样用,有坑?

    背景 在微服务项目中,大家都会去使用到分布式锁,一般也是使用Redis去实现,使用RedisTemplate、Redisson、RedisLockRegistry都行,公司的项目中,使用的是Redisson,一般你会怎么用?看看下面的代码,是不是就是你的写法 String lockKey = “forlan_lock_” + serviceId; RLock…

    Java 2023年4月17日
    00
  • java实现事件委托模式的实例详解

    Java实现事件委托模式的实例详解 事件委托模式(Event Delegation Pattern)是软件开发中常用的一种设计模式,它利用事件的传递机制,使一个对象能够处理不同来源的事件。在 Java 编程中,实现事件委托模式可以通过编写接口、事件源(Event Source)和事件监听器(Event Listener)三个部分来完成。 编写接口 在实现事件…

    Java 2023年5月19日
    00
  • 主流品牌笔记本保修例外情况汇集

    主流品牌笔记本保修例外情况汇集 随着笔记本电脑的使用越来越广泛,其维修保养问题也变得越来越重要。笔记本电脑厂商都提供了保修服务来维持其产品的质量和信誉度。然而,我们需要了解的是,保修服务也存在例外和限制。本文收集了主流品牌笔记本保修例外情况,以帮助用户更好地理解如何保护自己的笔记本电脑。 保修期限 笔记本保修期限一般为一年或两年。在保修期限内,除非是用户自己…

    Java 2023年6月15日
    00
  • SpringSecurity rememberme功能实现过程解析

    下面我给你详细讲解“SpringSecurity rememberme功能实现过程解析”的完整攻略。 1. 简介 Spring Security是一个流行的安全框架,可以为Web应用程序提供身份验证和授权的服务。其中的rememberme功能可以帮助用户在登出后不必重新登录,便能够快速访问应用程序。其实现原理是利用cookie存储用户登录凭据并在下次登录时使…

    Java 2023年5月20日
    00
  • Java中的Native方法

    Java中的Native方法:完整攻略 理解Native方法 JNI(Java Native Interface)可以让Java应用程序在运行时,与C/C++语言编写的函数进行交互。因为Java虚拟机(JVM)不能直接运行非Java代码, JNI支持调用Native方法,Native方法是一些用其他编程语言(如C/C++)编写的方法。 Native方法是指C…

    Java 2023年5月23日
    00
  • 十一、JSP及语法概要

    JSP(JavaServer Pages)是一个让用户可以在HTML网页内嵌入Java代码的技术。JSP技术在Web应用开发中得到了广泛的应用。本文将详细讲解JSP的语法概要和特点。 JSP的特点 JSP是基于Java技术的,因此具有良好的跨平台性。 JSP技术允许在HTML文档中插入Java代码,大大方便了Web应用程序的开发。 JSP支持自定义标签库的开…

    Java 2023年6月15日
    00
  • SpringSecurity自定义登录成功处理

    Spring Security是一个基于Spring框架的安全框架,它提供了一系列的安全服务,包括身份验证、授权、攻击防护等。在Spring Security中,我们可以自定义登录成功处理来实现自定义的登录成功逻辑。在本文中,我们将详细讲解Spring Security自定义登录成功处理的完整攻略。 自定义登录成功处理 在Spring Security中,我…

    Java 2023年5月18日
    00
  • Struts2拦截器 关于解决登录的问题

    为了解决网站用户登录的安全问题,我们可以使用Struts2拦截器。Struts2拦截器可以拦截用户的请求,并做出相应的处理,比如检查用户是否已经登录,如果没有则跳转至登录页面。以下是Struts2拦截器解决登录问题的完整攻略: 1. 编写拦截器 我们先来编写一个处理用户登录的拦截器。该拦截器会检查用户是否已经登录,如果没有登录,则直接跳转至登录页面。 pub…

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