Java 反射机制


更多内容,前往IT-BLOG
在这里插入图片描述

反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。

一、反射机制提供的功能(什么时候会用到反射)

【1】在运行时判断任意一个对象所属的类。
【2】在运行时构造任意一个类的对象。
【3】在运行时判断任意一个类所具有的成员变量和方法。
【4】在运行时调用任意一个对象的成员变量和方法。
【5】生成动态代理。

二、Class 类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。保存这些信息的类被称为ClassObject类中的getClass()方法将会返回一个Class类型的实例。具体细节说明如下:

public class ReflecTest {public static void main(String[] args) throws Exception {// Class 是带泛型的/*如果一个 Person 对象表示一个特定的人,那么一个 Class 对象将表示一个特定类的属性。*///获取 Class 的方法有三种,第一种如下:Class<Person> clazz = Person.class;//创建 clazz 对应的运行时类 Person 类的对象//创建类的对象:调用Class对象的newInstance()方法:要求是类必须有一个无参的构造器和类的构造器的访问权限需要足够Person person = clazz.newInstance();//也可以先 new 一个对象,通过 getClass 获取 Class对象,从而得知此目标对象的结构Person personTest = new Person();//获取 Class 的方法有三种,第二种如下:Class<? extends Person> personTestClass = personTest.getClass();String clazzName = personTestClass.getName();//com.reflection.learn.PersonSystem.out.printf(clazzName);//获取 Class 的方法有三种,第三种如下:通过Class 的静态方法获取Class<?> className = Class.forName("com.reflection.learn.Person");//通过反射调用运行时类的指定属性Field name = clazz.getField("name");//给属性设置set 时,需要将**对象**和值传入 信息定义 public String name;//获取公有方法name.set(person,"Li Si");//获取私有方法 private int age;Field age = clazz.getDeclaredField("age");age.setAccessible(true);age.set(person,20);//通过反射指定运行的方法(无参)Method display = clazz.getMethod("display");//执行此方法invoke,需要传入对象display.invoke(person);//如果是静态方法,调用规则如下://display.invoke(Person.class);//调用有参方法 public void getObject(String name)Method getObject = clazz.getMethod("getObject", String.class);//方法的执行,需传入对象和参数getObject.invoke(person,"Li Si");}
}

java.lang.Class:是反射的源头:我们创建一个类,通过编译器javac.exe生成对应的.class文件。之后使用java.exe加载(JVM 的类加载器)此.class文件到内存中以后,此文件就是一个运行时类,存在于缓冲区中。这个运行时类本身就是一个Class是实例。且一个运行时类只加载一次。

三、通过反射调用类中指定的方法和属性(重要)

@Test
public void test2() throws Exception{//获取指定的构造器Class<Person> clazz = Person.class;//获取指定构造器Constructor<Person> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);Person person = declaredConstructor.newInstance("li", 20);//输出:Person{name='li', age=20}System.out.println(person.toString());//获取指定的方法Method getObject = clazz.getDeclaredMethod("getObject", String.class);getObject.invoke(person,"zhangsan");
}

四、利用反射分析类的能力

java.lang.reflect包中有三个类Field(域)、Method(方法)、Constructor(构造器)。这三个类都有一个叫做 getName方法,用来返回项目的名称。Filed类有一个getType方法,用来返回描述域所属类型的 Class 对象。Method 与 Constructor 类有能够报告参数的方法getParameterTypesMethod类还有一个可以报告返回类型的方法getReturnType()。这三个类还有一个getModifiers方法,返回一个整数值,用不同的位开关描述publicprivate等修饰符。可以通过Modifier类的静态方法将整数转化为public等。Class 类的getDeclareFieldsgetDeclareMethodsgetDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受保护的成员,但不包括父类成员。

get方法有一个需要解决的问题,name域是一个String时,我们将它当做Object返回没有什么问题。但是假定我们想要查看salary域。它属于double类型,而java中数据值类型不是对象。可以使用Field类中的getDouble方法,也可以调用get方法,此时,反射机制将自动地将这个域值打包到相应的对象包装器中,这里打包成Double

五、应用

【1】JDK 的动态代理:链接
【2】Spring 的 AOP 面向切面编程:链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496767.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp腾讯地图JavaScript Api,H5端和原生APP端可用

因项目需要&#xff0c;在uniapp中集成使用腾讯地图&#xff0c;为了方便维护&#xff0c;希望通过一套代码实现H5和APP同时可用。H5显示相对简单&#xff0c;APP端比较麻烦&#xff0c;记录下实现过程 一、集成步骤 1.使用 renderjs script标签使用renderjs&#xff0c;因为…

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…

SpringCloud认识微服务

文章目录 1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 微服务架构是一种架构模式&…

爬虫入门四(抽屉半自动点赞、xpath使用、动作链、打码平台、scrapy框架介绍与安装及创建项目)

文章目录 一、抽屉半自动点赞二、xpath的使用三、动作链四、打码平台介绍超级鹰打码基本测试 五、自动登录超级鹰六、scrapy框架介绍安装创建爬虫项目 一、抽屉半自动点赞 登录抽屉账号保存cookiesimport timeimport jsonfrom selenium import webdriverfrom selenium.webdrive…

c# 异常处理

异常类 .NET Framework 类库中的所有异常都派生于 Exception 类&#xff0c;异常包括系统异常和应用异常。 默认所有系统异常派生于 System.SystemException&#xff0c;所有的应用程序异常派生于 System.ApplicationException。 系统异常一般不可预测&#xff0c;比如内存堆…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式&#xff0c;虽然它可能看起来有些复杂&#xff0c;但是一旦掌握了基本命令&#xff0c;你…

stable-diffusion-webui-forge 介绍,安装,运行

一 stable-diffusion-webui-forge 介绍 stable-diffusion-webui-forge 的作用和stable-diffusion-webui一样&#xff0c;但性能上作了优化&#xff0c;说得上是是stable-diffusion-webui优化版&#xff0c;本人在使用stable-diffusion-webui时偶尔会有内存不够报错。本人的环境…

‘grafana.ini‘ is read only ‘defaults.ini‘ is read only

docker安装grafana 关闭匿名登录情况下的免密登录遇到问题 grafana.ini is read only defaults.ini is read only 参考回答&#xff08;Grafana.ini giving me the creeps - #2 by bartweemaels - Configuration - Grafana Labs Community Forums&#xff09; 正确启动脚本 …

《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)

文章目录 1. 概述2. 理论基础2.1 函数理论2.2 抽样理论 3. 技术手段3.1 增量式开发3.2 基于函数的规范与设计3.3 正确性验证3.4 统计测试 (Statistically Based Testing) 和软件认证 4. 应用与缺点1&#xff09;太理论化2&#xff09;缺少传统模块测试3&#xff09;带有传统软件…

仅用于个人记录:地热文章阅读

22年Q1 The Geothermal Artificial Intelligence for geothermal exploration 目的&#xff1a;像素级探测地热。 步骤&#xff1a; 一、选AOI&#xff0c;包括Brady和Desrt Peak 二、 地热指标分析 1&#xff09;温度 temperature 2018年至2019年期间25张LANDSAT 8的二级…

图搜索基础-深度优先搜索

图搜索基础-深度优先搜索 参考原理引入流程解析手推例子 代码实现运行结果结果分析 参考 理论参考&#xff1a;深蓝学院 实现参考&#xff1a;github项目 原理 引入 对于这样一个图&#xff0c;我们试图找到S到G的通路&#xff1a; 计算机程序不会像人眼一样&#xff0c;一…

通过代码加载mybatis的mapper xml

通过代码加载mybatis的mapper xml jpa 性能确实差&#xff0c;转战 mybatis 了 依赖 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>&l…