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

Java反射详解

Java反射

一.什么是反射

我们使用的一些像框架,tomcat,或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性。这是如何做到的?

当他们加载我们本地的类时,需要先创建对象,然后将查询到的结果封装到创建的对象中(调用setxxx()方法,调用xxx属性),但问题是框架只知道Student类的地址,它是如何使用类的?

框架只能根据配置文件中配置的类的地址决定要创建并操作哪个类:

    <select id="findStudents" parameterType="Student" resultType="xx.xx.xx.Student">

而且框架要做到可以处理任何类,只需要一套程序来处理,这是怎么办到的?

这时候我们就需要反射机制,只用一套程序来解决框架处理任何类的问题。

反射:

JAVA反射机制是再运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对西昂,都能调用它的任意一个方法和属性,这种动态获取信息以及动态调用对西昂的方法的功能称为java语言的反射机制。它的作用就是动态获取类的信息。

二.Class类:

反射机制当中有一个类叫Class,Class类的类表示正在运行的Java应用程序中的类和接口。

一旦class文件被加载到内存,就会为其创建一个Class对象,任何类被使用时都会创建一个Class对象。

Class类是Java反射机制的基础,可以通过获取类的Class类,可以得到一个类的基本信息。

那么如何获得类的Class对象?

方式1:

        String s="Model.User";Class c1=Class.forName(s);   //把给定地址的类进行了加载,为其创建Class对象Class c2=Class.forName(s);   //把给定地址的类进行了加载,为其创建Class对象System.out.println(c1);System.out.println(c2);System.out.println(c1==c2); //true:c1和c2表示的是同一个//通过user的Class对象,就看可以获得User类的基本信息

方式2:

        Class c3= User.class;

方式3:

        User user=new User();Class c4=user.getClass();   //通过已知的对象中的getClass() 获得该对象类的Class对象

那么成功获取对象类的Class对象后如何取得其中相关信息呢?

1.创建对象
        //通过Class类的对象,来创建User对象//newInstance调用默认无参构造方法,所以如果类中有有参构造方法还需要单独把无参构造方法也写出来否则IllegalAccessExceptionObject objectUser=c.newInstance();
2.获取类中的构造方法信息
//类中要确保有无参构造方法否则异常NoSuchMethodExceptionConstructor constructor1=c.getConstructor(); //获得类中指定的公共public构造方法Object objectUser = constructor1.newInstance(); //通过构造方法中newInstance创建对象Constructor constructor2=c.getDeclaredConstructor(); //获得类中的指定沟构造方法(包括私有)Constructor constructor3=c.getConstructor(String.class,String.class);   //获得公共的有参构造方法Object objectUser1=constructor3.newInstance("用户1","密码1");   //创建对象,并为对象属性复制Constructor[] constructors=c.getConstructors(); //获得所有的公共的构造方法c.getDeclaredConstructors(); //获得包括私有的所有的构造方法

小知识点:java创建对象三种方式:

(1)new (2)反射机制的newInsteance (3)序列化与反序列化读取文件中的类

3.获得成员变量
String s="Model.User";Class c=Class.forName(s);   //获得类的Class对象Object objectUser=c.newInstance();  //创建User对象//获得类中的成员变量//获得类中指定的公共的属性,把属性封装到一个Field对象// Field userNameField = c.getField("userName");Field userNameField = c.getDeclaredField("userName");   //私有成员变量//获得所有的属性Field [] fields=c.getFields();//包括私有Field [] fields1=c.getDeclaredFields();//用HashMap模拟查询到的数据HashMap<String,String> map=new HashMap<>();map.put("userName","admin");map.put("password","123456");//循环所有的属性,为属性赋值for (Field f: fields) {//打破了封装性,!慎用,建议使用getset方法因为可能setget方法中还有逻辑语句f.setAccessible(true);  //设置可以访问私有属性f.set(objectUser,map.get(f.getName()));}
4.获得方法
		String s="Model.User";Class c=Class.forName(s);   //获得类的Class对象Object objectUser=c.newInstance();  //创建User对象Method eat1=c.getMethod("eat");//执行objectUser对象中的无参eat方法——invoke:调用eat1.invoke(objectUser);Method eat2=c.getMethod("eat",String.class);eat2.invoke(objectUser,"参数");//包括继承的方法Method[] methods1=c.getMethods();//获得本类中所有的成员方法包括私有Method[] methods2=c.getDeclaredMethods();System.out.println(methods1.length);    //15System.out.println(methods2.length);    //7Field[] fields=c.getDeclaredFields();   //获得所有属性for (Field f:fields) {  //循环拿到每一个属性//通过属性名 匹配到getset方法String set="set"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1);Method setMethod=c.getMethod(set,String.class);  //通过set方法名获得set方法setMethod.invoke(objectUser,"用户和密码");   //调用set方法}

相关文章:

Java反射详解

Java反射 一.什么是反射 我们使用的一些像框架&#xff0c;tomcat&#xff0c;或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名&#xff0c;就可以创建给定类的对象&#xff0c;并调用该对象的方法和属性。这是如何做到的&#xff1f; 当他们加载我们…...

Spring Boot与Apache Kafka集成的深度指南

Spring Boot与Apache Kafka集成的深度指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代分布式系统中&#xff0c;消息队列的作用愈发重要&#xff0…...

甄选版“论软件系统架构评估”,软考高级论文,系统架构设计师论文

论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…...

uniapp开发企业微信内部应用

最近一直忙着开发项目&#xff0c;终于1.0版本开发完成&#xff0c;抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品&#xff0c;公司扩展业务&#xff0c;需要在企业微信中开发内部应用。因为工作中使用的是钉钉&#xff0c;很少使用企业微信&#xff0c;对于…...

0122__linux之eventfd理解

linux之eventfd理解-CSDN博客 Linux fd 系列 — eventfd 是什么&#xff1f;-CSDN博客...

数学建模 —— 查找数据

目录 百度搜索技巧 完全匹配搜索&#xff1a;查询词的外边加上双引号“ ” 标题必含关键词&#xff1a;查询词前加上intitle: 搜索文档&#xff1a;空格再输入filetype:文件格式 去掉不想要的&#xff1a;查询词后面加空格后加减号与关键字 知网查文献 先看知网的硕博士…...

合并有序链表

合并有序链表 图解代码如下 图解 虽然很复杂&#xff0c;但能够很好的理解怎么使用链表&#xff0c;以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…...

【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;微信&#xff1a;xxh_1459&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业了…...

Spark基于DPU的Native引擎算子卸载方案

1.背景介绍 Apache Spark&#xff08;以下简称Spark&#xff09;是一个开源的分布式计算框架&#xff0c;由UC Berkeley AMP Lab开发&#xff0c;可用于批处理、交互式查询&#xff08;Spark SQL&#xff09;、实时流处理&#xff08;Spark Streaming&#xff09;、机器学习&a…...

Mini2440 start.s 修改支持串口输出,方便调试 (四)

经常会遇到点板子的时候&#xff0c;板子没有任何反应&#xff01;怎么知道板子有没有在正常启动&#xff0c;在uboot阶段 start.s 中加入串口打印信息是很有必要的&#xff01; 输出串口信息 ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoo…...

【教程】几种不同的RBF神经网络

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…...

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载&#xff1a; https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括…...

【Java笔记】Flyway数据库管理工具的基本原理

文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理&#xff0c;顺便了解了下基本原理&#xff0c;做个记录。 详细的使用就不写了&#xff0c;网上教程很多…...

国际数字影像产业园创业培训,全面提升创业能力!

国际数字影像产业园作为数字影像产业的创新高地&#xff0c;致力于提供全面的创业支持服务。其中&#xff0c;创业培训作为重要的组成部分&#xff0c;旨在通过系统的课程设置和专业的讲师团队&#xff0c;为创业者提供从基础到进阶的全方位指导&#xff0c;帮助他们在数字影像…...

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频&#xff0c;手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下&#xff1a;包含快进、快退、暂停等功能&#xff0c; 代码如下&#xff1a; # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位&#xff0c;将定位到…...

VUE----通过nvm管理node版本

使用 NVM&#xff08;Node Version Manager&#xff09;来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤&#xff1a; 1. 安装 NVM 如果你还没有安装 NVM&#xff0c;可以按照以下步骤进行安装&#xff1a…...

R语言进行字符的替换和删减gsub,substr函数

目录 R语言读文件“-“变成“.“ 提取列字符前几个 提取列字符末尾几个 进行字母替换 paste0函数使用 长宽数据转换 R语言读文件“-“变成“.“ R语言读文件“-“变成“.“_r语言 列名中的-变成了点-CSDN博客 怎样将"."还原为"-" rm(list = ls()…...

2024年6月27日,欧盟REACH法规新增第31批1项SVHC高关注物质

ECHA公布第31批1项SVHC&#xff0c;物质已增至241项 2024年6月27日&#xff0c;ECHA公布第31批1项SVHC&#xff0c;总数达241项。新增物质未包括磷酸三苯酯&#xff0c;仍在评议中。REACH法规要求SVHC含量超0.1%需告知下游&#xff0c;出口超1吨须通报ECHA。SCIP通报要求SVHC含…...

高通410-linux棒子设置网络驱动

1.首先打开设备管理器 2.看到其他设备下的RNDIS&#xff0c;右键更新驱动程序 3.点击浏览我的电脑… 最后一个...

PostgreSQL的系统视图pg_stat_archiver

PostgreSQL的系统视图pg_stat_archiver 在 PostgreSQL 数据库中&#xff0c;pg_stat_archiver 视图提供了关于归档进程&#xff08;archiver process&#xff09;的统计信息。归档进程负责将 WAL&#xff08;Write-Ahead Logging&#xff09;日志文件复制到归档存储&#xff0…...

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界&#xff01;可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证&#xff0c;这一目标很快就能达成&#xff01;但首先&#xff0c;我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…...

面试经验分享 | 渗透测试工程师(实习岗)

所面试的公司&#xff1a;某安全厂商 所在城市&#xff1a;南京 面试职位&#xff1a;渗透测试工程师实习岗位 面试过程&#xff1a; 腾讯会议&#xff08;视频&#xff09; 面试过程&#xff1a;整体流程就是自我介绍加上一些问题问题balabalabala。。。由于面的岗位是渗透…...

STM32 IWDG(独立看门狗)

1 IWDG简介 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff09;&#xff0c;另外一个是窗口看门狗。独立看门狗也称宠物狗&#xff0c;窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的…...

ios swift5 获取wifi列表

参考博客&#xff1a; iOS之Wifi开发探究 - 稀土掘金 iOS 无法获取 WiFi 列表&#xff1f;一定是因为你不知道这个框架 - 稀土掘金 iOS获取Wifi列表详解 - 简书...

回溯法c++学习 解决八皇后问题

使用回溯法解决八皇后问题 八皇后问题是一个以国际象棋为背景的问题&#xff1a;如何能够在88 的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了达到此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。这…...

5. Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么&#xff1f;★ &#xff08;Spring 是包含了众多⼯具⽅法的 IoC 容器&#xff09;1.1.1 什么是容器&#xff1f;1.1.2 什么是 IoC&#xff1f;★ &#xff08;IoC: Inversion of Control (控制反转)&#xff09;总…...

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯&#xff0c;每次项目的数据库都是在线上创建&#xff0c;Navicat 连接线上数据库进行处理&#xff0c;最近有一个项目需要二次升级&#xff0c;发现老项目部署的服务器到期了&#xff0c;完蛋&#xff0c;数据库咩了&#xff01;&#xff01;&#xff01;…...

探索 Spring Cloud Gateway:构建微服务架构的关键一环

1. 简介 在当今的分布式系统中&#xff0c;微服务架构已经成为了一种流行的架构模式。在微服务架构中&#xff0c;服务被拆分为小型、可独立部署的服务单元&#xff0c;这些服务单元能够通过网络互相通信&#xff0c;形成一个整体的应用系统。然而&#xff0c;随着微服务数量的…...

P1114 “非常男女”计划最优解

原题地址 P1114 “非常男女”计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码题解 AC代码&#xff08;1&#xff09; 因为用的是级的算法&#xff0c;所以最后一个 了&#xff0c;这里使用特判来得到的&#xff0c;给你们放一下代码&#xff1a; #include <bi…...

C++ | Leetcode C++题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; class Solution {const int L 10;unordered_map<char, int> bin {{A, 0}, {C, 1}, {G, 2}, {T, 3}}; public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;int n s.length();if (n < L…...

35公司做的网站漏洞/如何做好关键词的优化

基本类型&#xff0c;或者叫做内置类型&#xff0c;是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型。java是一种强类型语言&#xff0c;第一次申明变量必须说明数据类型&#xff0c;第一次变量赋值称为变量的初始化。 1、基本类型及其封装器类 Java基本类型共有…...

会做网站的公司/2345网址导航智能主板

工具 window10 django2.2.2 mysql5.6 django默认使用mysqlclient连接mysql&#xff0c;但是在window下直接安装mysqlclient不容易成功&#xff0c;可以使用pymysql 代替。 但使用如下方式报错&#xff1a; #settings.py import pymysql pymysql.intall_as_MySQLdb()django 3.…...

上海松江做网站建设/如何建立个人网址

MemcacheDB是 一个开源项目&#xff0c;给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制&#xff0c;让memcached具备了事务恢复能力、持久化能力和分布式复制能力&#xff0c;非常适合于需要超高性能读写速度&#xff0c;但是 不需要严格事务…...

网站编程培训学校招生/搜索引擎优化文献

提交一个 服务器请求&#xff08;support request&#xff09; 然后在你的服务请求中同时提供下面的信息。 Confluence 服务器 登录 Confluence 然后访问管理员控制台。 将 系统信息&#xff08;System Information&#xff09;页面的中内容进行截图&#xff0c;或者保存页面为…...

有个专门做装修的网站/硬件优化大师下载

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 数据治理伴随着数据全生命周期的进程&#xff0c;涉及事前规范检查、事中监控管理、事后优化复盘等过程&#xff0c;关键重点领域包括数据质量的可用性、一致性&…...

深圳做门户网站的网络公司/深圳网络公司推广

QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 TPS&#xff1a;是TransactionsPerSecond的缩写&#xff0c;也就是事务数/秒。它是软件…...