Java反射

发布时间:2024年01月10日

Java的反射机制可以动态获取类和对象的信息,以及动态调用对象的方法,被广泛应用于动态代理的场景中。

概念

反射机制指在程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意对象都能调用其任意方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能称为Java的反射机制。

JAVA反射API

Class类:用于获取类的属性、方法等信息。
Field类:表示类的成员变量、用于获取和设置类中的属性值
Method类:表示类的方法,用于获取方法的描述信息或者执行某个方法。
Constructor类:表示类的构造方法。
方法介绍:
**setAcessible(boolean flag)**为访问对象设置可访问标志。flag为true表明屏蔽JAVA语言的访问检查,使得对象的私有属性也可以被查询和设置。该方法是AccessibleObject类中的一个方法,它是Field、 Method、Constructor的公共父类。
当Field、Method或Constructor (三者都是反射对象)分别用于设置字段(set(Object obj, Object value))或获取字段(get(Object obj))、调用方法(invoke(Object obj, Object… args))或创建和初始化类的新实(newInstance(Object… initargs))时,将执行运行时访问检查。
注意:方法名setAccessible很容易让人产生误解,给人的感觉是设置了成员的可访问性,例如,觉得public修饰的成员是任意类都可以访问的,所以可访问标志是true;觉得private修饰的成员只有本类可以访问,所以可访问标志是false。其实不然,不管是什么访问权限,其可访问标志的值都为false。
————————————————
原文链接:https://blog.csdn.net/gao_zhennan/article/details/123828322

应用场景

1.框架设计
在框架设计中,我们通常需要使用反射技术来解耦,使框架可扩展和灵活
2.单元测试
在单元测试中我们可以使用反射来访问私有或受保护的类成员,使测试更加全面
3.动态代理
使用反射技术可以创建动态代理对象,从而可以在运行时期代理任意一个实现了接口的对象,实现AOP功能。
4.JavaBean
JavaBean是一种轻量级组件,它封装了一个JavaBean类的属性和方法,并提供了访问和修改JavaBean属性的方法。反射技术可以访问和修改JavaBean类的私有属性和方法。
5.序列化和反序列化
许多JAVA序列化和反序列化工具都是基于JAVA反射机制实现的,例如Java的ObjectInputStream和Java的ObjectOutputStream。

总之,Java反射技术可以在很多场景中应用,尤其是在框架设计和组件化开发中,反射技术可以提高代码的灵活性和可扩展性,减少代码耦合性,简化代码的编写。但是,反射机制也增加了程序的复杂度,因此必须谨慎使用。

实例:
在SpringBoot项目中,JAVA反射通常在以下情况下使用:
(1)依赖注入(DI)和控制反转(IOC):SpringBoot使用反射来实现自动注入依赖对象和执行控制反转。例如@Autowired就是通过反射实现自动注入的
(2)Bean实例化:SpringBoot使用反射来实现实例化Bean对象。例如,@Bean就是通过反射实现Bean的实例化和初始化。
(3)AOP编程:SpringBoot使用反射来实现面向切面编程(AOP)。例如,@Aspect注解就是通过反射实现AOP的。
(4)数据库访问:SpringBoot使用反射来实现ORM(对象映射框架),例如Spring Data JPA。反射技术可以根据实体类的注解信息自动生成SQL语句,从而实现数据访问。
(5)配置读取:Spring Boot框架使用反射来读取配置文件中的信息。例如,@ConfigurationProperties注解就是通过反射实现配置读取的。
(6)动态代理:Spring Boot框架使用反射来实现动态代理,从而实现事务管理、缓存管理等功能。例如,@Transactional注解就是通过反射实现动态代理的。
(7)属性编辑器:Spring Boot框架使用反射来实现属性编辑器,从而实现对JavaBean属性的编辑和转换。例如,@InitBinder注解就是通过反射实现属性编辑器的。
(8)注解处理器:Spring Boot框架使用反射来实现注解处理器,从而实现自定义注解和注解处理逻辑。例如,@RequestMapping注解就是通过反射实现注解处理器的。
(9)方法拦截器:Spring Boot框架使用反射来实现方法拦截器,从而实现对方法的前置、后置、异常处理等操作。例如,HandlerInterceptor接口就是通过反射实现方法拦截器的。

总之,Java反射在Spring Boot项目中有非常广泛的应用场景,可以用于实现依赖注入、AOP编程、数据库访问、动态代理、配置读取、属性编辑器、注解处理器、方法拦截器等功能。使用反射时需要注意安全性和性能问题,避免不必要的性能开销和安全隐患
参考博客https://blog.csdn.net/m0_68705273/article/details/131006947

相关面试题

1.通过反射创建实例对象有几种方法?
有两种方法,分别为Class.newInstance()和Constructor.newInstance()
二者的区别:
1.Class.newInstance()只能调用无参的构造函数,即默认的构造函数;Constructor.newInstance()可以根据传入的参数,调用任意的构造函数
2.Class.newInstance()要求被调用的构造函数必须是可见的,即必须是public的;Constructor.newInstance()在特定情况下可以调用私有的构造函数,需要通过setAcessible(true)实现。
2什么是反射,.JAVA反射机制的作用
反射机制是指在程序运行中,对任意一个类都能获取其所有属性和方法,并且对任意对象都能调用其任意方法的功能。
反射机制能够提高代码的灵活性和扩展性,减少代码耦合性。但是反射也增加了代码的复杂程度,会带来不必要的性能开销和安全隐患。反射机制在框架设计、单元测试、动态代理、序列化和反序列化等很多场景中都有应用,尤其是在框架设计和组件化开发中经常见到。

文章来源:https://blog.csdn.net/weixin_44145526/article/details/135499455
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。