当前位置: 首页 > news >正文

简单介绍反射

1.定义

Java的反射机制是在运行状态中,对于任意一个类,都知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性,既然能拿到,我们就可以修改部分类型信息;这种动态获取信息的以及动态调用对象方法的功能称为java语言的反射机制。

2.用途

  1. 在日常的第三方应用的开发过程中,经常会遇到某个类的某个成员变量、方法或者是属性是私有的或者是只对系统应用开发的,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或者是方法。

  1. 反射最重要的用途是开发各种通用框架,比如在spring中,我们将所有的类bean交给spring容量管理器,无论是XML配置Bean还是注解配置,当我们从容器中回去Bean来以来注入时,容器会读取配置,而配置中给的就是类的相关信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

3.反射基本信息

Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型。程序需要在运行时发现对象和类的真实信息。通过使用反射程序就能够判断出该对象和类属于哪些类。

4.反射相关类(重点)

类名

用途

Class类

代表类的试题,在运行的Java应用程序中表示类和接口。

Field类

代表类的成员变量/类的属性

Method类

代表类的方法

Constructor类

代表类的构造方法

4.1Class类(反射机制的起源)

4.1.1Class类中对应的相关方法

  • (重要)常用获取类的方法

方法

用途

getClassLoader()

获取类的加载器

getDeclaredClasses()

返回一个数组,数组中包含该类中所有类和接口类的对象(包含私有的)

forName(String className)

根据类名返回类的对象

newInstance()

创建类的实例

getName()

获取类的完整路径名字

  • (重要)常用获取类中属性相关的方法

方法

用途

getField(String name)

获取某个共有的属性对象

getFields()

获取所有共有的属性对象

getDeclaredField(String name)

获取某个属性对象

getDeclaredFields()

获取所有属性对象

  • (重要)获取类中构造器相关的方法

方法

用途

getConstructor(Class...<?>parameterTypes)

获取该该类中与参数类型匹配的共有构造方法

getConstructors()

获取该类中的所有共有的构造方法

getDeclaredConstructor(Class...<?>parameterTypes)

获取该类中与参数匹配的构造方法

getDeclaredConstructors()

获取该类所有的构造方法

  • (重要)获取该类中方法相关的方法

方法

用途

getMethod(String name, Class...<?>parameterTypes)

获取该类的某个共有的方法

getMethods()

获取该类所有共有的方法

getDeclaredMethod(String name,Class...<?>parameterTypes)

获取该类某个方法

getDeclaredMethods()

获取该类的所有方法

4.2反射实例

4.2.1获取Class对象的三种方式

class Student{//私有属性nameprivate String name = "bit";//公有属性agepublic int age = 18;//不带参数的构造方法public Student(){System.out.println("Student()");}private Student(String name,int age) {this.name = name;this.age = age;System.out.println("Student(String,name)");}private void eat(){System.out.println("i am eat");}public void sleep(){System.out.println("i am pig");}private void function(String str) {System.out.println(str);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test {//获取class对象的三种方式public static void main(String[] args) {//通过getclass获取对象Student s1 = new Student();Class c1 = s1.getClass();//直接通过类名.class的方式得到Class c2 = Student.class;//通过Class对象的ForName()静态方法来获取,可能抛出ClassNotFoundException异常Class c3 = null;try{//这里需要类的全路径c3 = Class.forName("Student");}catch (ClassNotFoundException e) {e.printStackTrace();}System.out.println(c3);}
}

4.2.2反射的使用

注意】所有和反射相关的包都在import java.lang.reflect包下面

public class Test {public static void reflectNewInstance() {try {Class<?> classStudent = Class.forName("Student");Object objectStudent = classStudent.newInstance();Student student = (Student) objectStudent;System.out.println("获取学生对象:" + student);}catch (Exception ex) {ex.printStackTrace();}}//反射私有的构造方法,屏蔽内容为获取共有的构造方法public static void reflectPrivateConstructor() {try {Class<?> classStudent = Class.forName("Student");//注意传入对应的参数Constructor<?> declaredConstructorStudent = classStudent.getDeclaredConstructor(String.class, int.class);//设为true后可以修改访问权限declaredConstructorStudent.setAccessible(true);Object objectStudent = declaredConstructorStudent.newInstance("小明", 20);Student student = (Student)objectStudent;System.out.println("获得私有构造哈数且修改姓名和年龄:"+ student);} catch (Exception ex) {ex.printStackTrace();}}// 反射私有属性public static void reflectPrivateField() {try {Class<?> classStudent = Class.forName("Student");Field field = classStudent.getDeclaredField("name");field.setAccessible(true);
//可以修改该属性的值Object objectStudent = classStudent.newInstance();Student student = (Student) objectStudent;field.set(student,"小明");String name = (String) field.get(student);System.out.println("反射私有属性修改了name:"+ name);} catch (Exception ex) {ex.printStackTrace();}}// 反射私有方法public static void reflectPrivateMethod() {try {Class<?> classStudent = Class.forName("Student");Method methodStudent = classStudent.getDeclaredMethod("function",String.class);System.out.println("私有方法的方法名为:"+methodStudent.getName());
//私有的一般都要加methodStudent.setAccessible(true);Object objectStudent = classStudent.newInstance();Student student = (Student) objectStudent;methodStudent.invoke(student,"我是给私有的function函数传的参数");} catch (Exception ex) {ex.printStackTrace();}}public static void main(String[] args) {
//reflectNewInstance();
//reflectPrivateConstructor();
//reflectPrivateField();reflectPrivateMethod();}

5.反射优点和缺点

优点

  1. 对于任意一个类,都知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法

  1. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力

  1. 反射已经运用到很多流行框架:Struts, Hibernate, Spring等

【缺点】

  1. 使用反射会导致效率降低

  1. 反射技术绕过了源代码的技术,会带来很多维护的问题。反射代码比相应的直接代码更复杂。

相关文章:

简单介绍反射

1.定义Java的反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能调用它的任意方法和属性&#xff0c;既然能拿到&#xff0c;我们就可以修改部分类型信息&#xff1b;这种动态获取信息的…...

PyTorch学习笔记:nn.MSELoss——MSE损失

PyTorch学习笔记&#xff1a;nn.MSELoss——MSE损失 torch.nn.MSELoss(size_average None&#xff0c;reduce None&#xff0c;reduction mean)功能&#xff1a;创建一个平方误差(MSE)损失函数&#xff0c;又称为L2损失&#xff1a; l(x,y)L{l1,…,lN}T,ln(xn−yn)2l(x,y)L…...

apache和nginx的TLS1.0和TLS1.1禁用处理方案

1、TLS1.0和TLS1.1是什么&#xff1f; TLS协议其实就是网络安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性&#xff0c;TLS 1. 0 和TLS 1. 1 是分别是96 年和 06 年发布的老版协议。 2、为什么要禁用TLS1.0和TLS1.1传输协议 TLS1.0和TLS1.1协…...

K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示

K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC光敏电阻传感器模块1.2、STM32F103C8T6光敏电阻传感器模块五、基…...

《机器学习》学习笔记

第 2 章 模型评估与选择 2.1 经验误差与过拟合 精度&#xff1a;精度1-错误率。如果在 mmm 个样本中有 aaa 个样本分类错误&#xff0c;则错误率 Ea/mEa/mEa/m&#xff0c;精度 1−a/m1-a/m1−a/m。误差&#xff1a;一般我们把学习器的实际预测输出与样本的真实输出之间的差…...

前端卷算法系列(一)

前端卷算法系列&#xff08;一&#xff09; 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…...

【机器学习】聚类算法(理论)

聚类算法&#xff08;理论&#xff09; 目录一、概论1、聚类算法的分类2、欧氏空间的引入二、K-Means算法1、算法思路2、算法总结三、DBSCAN算法1、相关概念2、算法思路3、算法总结四、实战部分一、概论 聚类分析&#xff0c;即聚类&#xff08;Clustering&#xff09;&#xf…...

Docker-用Jenkins发版Java项目-(1)Docke安装Jenkins

文章目录前言环境背景操作流程docker安装及jenkins软件安装jenkins配置登录配置安装插件及创建账号前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff0c;如有错误&#xff0c;敬请指出&#xff0c;在此拜谢&#xff01; 最近新购得了M2的MAC&#xff0c…...

java集合框架内容整理

主要内容集合框架体系ArrayListLinkedListHashSetTreeSetLinkedHashSet内部比较器和外部比较器哈希表的原理List集合List集合的主要实现类有ArrayList和LinkedList&#xff0c;分别是数据结构中顺序表和链表的实现。另外还包括栈和队列的实现类&#xff1a;Deque和Queue。• Li…...

win10系统安装Nginx

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 Nginx可以进行反向代理、负载均衡、HTTP服务器&#xff08;动静分离&#xff09;、正向代理等操作。因为最近在公司使用到了Nginx 第一步&#xff1a;下载Nginx …...

数据库学习笔记(2)——workbench和SQL语言

1、workbench简介&#xff1a; 登录客户端的两种方法 在cmd中&#xff0c;只能通过sql语句控制数据库&#xff1b;workbench其实就是一种图形化数据库管理工具&#xff0c;在workbench中既可以通过sql语句控制数据库&#xff0c;也可以通过图形化界面控制数据库。通过workbenc…...

测量学期末考试之名词解释总结

仅供自己参考&#xff0c;且范围不全面.大地水准面与处于静止平衡状态的平均海水面重合&#xff0c;并延伸通过陆地的水准面高程地面点到大地水准面的铅锤距离水准面处于静止状态的水面就是水准面高差两点的水准面之间的铅锤距离垂直角在铅锤面上&#xff0c;瞄准目标的倾斜视线…...

TDengine时序数据库的简单使用

最近学习了TDengine数据库&#xff0c;因为我们公司有硬件设备&#xff0c;设备按照每分钟&#xff0c;每十分钟&#xff0c;每小时上传数据&#xff0c;存入数据库。而这些数据会经过sql查询&#xff0c;统计返回展示到前端。但时间积累后现在数据达到了百万级数据&#xff0c…...

记录每日LeetCode 2335.装满被子需要的最短总时长 Java实现

题目描述&#xff1a; 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要…...

了解线程池newFixedTheadPool

什么是线程池 操作系统 能够进行运算 调度 的最小单位。线程池是一种多线程处理形式。 为什么引入线程池的概念 解决处理短时间任务时创建和销毁线程代价较大的弊端&#xff0c;可以使用线程池技术。 复用 饭店只有一个服务员和饭店有10个服务员 线程池的种类 newFixedThea…...

IP分片和TCP分段解析--之IP分片

本文目录什么是IP分片为什么会产生IP分片为什么要避免IP分片如何避免IP分片什么是IP分片 IP协议栈将TCP/UDP传输层要求它发送的&#xff0c;但长度大于发送端口MTU的一个数据包&#xff0c;分割成多个IP报文后分多次发送。这些分成多次发送的多个IP报文就是IP分片。 为什么会…...

物联网方向常见通信方式有哪些?

常用的有线通信方式有串口、以太网等。 1、串口 串口通信普及率高、成本低,但是组网能力差,只适合低速率和小数据量的通信 2、以太网接口(网线) 以太网(Ethernet)是目前最普遍的一种局域网 通信技术,它规定了包括 物理层的连线、电子信号和介质访问层协议的内容。 以太…...

windows wireshark抓到未加入组的组播消息

现象 在Windows上开启wireshark&#xff0c;抓到了大量地址为239.255.255.251的组播包。 同时&#xff0c;根据组播相关命令&#xff0c;调用netsh interface ipv4 show joins&#xff0c;显示当前并没加入 239.255.255.251 组播组。 解决 根据IGMP Snooping&#xff0c;I…...

【PTA Advanced】1156 Sexy Primes(C++)

目录 题目 Input Specification: Output Specification: Sample Input 1: Sample Output 1: Sample Input 2: Sample Output 2: 思路 代码 题目 Sexy primes are pairs of primes of the form (p, p6), so-named since "sex" is the Latin word for "…...

项目(今日指数)

一 项目架构1.1 今日指数技术选型【1】前端技术【2】后端技术栈【3】整体概览3.2 核心业务介绍1】业务结构预览【2】业务功能简介1.定时任务调度服务XXL-JOB通过RestTemplate多线程动态拉去股票接口数据&#xff0c;刷入数据库&#xff1b; 2.国内指数服务 3.板块指数服务 4.涨…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...