反射机制简单基础

前序

在我们没有学习框架之前我们都是通给new来创建对象,如:创建一个我们已知的对象

Car car=new Car();

调用类中的成员变量和成员方法都是对象直接调用。

在学习了mybatis框架后,我们了解到可以通过类名,能动态得到类中定义的信息,包括类中有哪些方法,有哪些属性等

比如在xml映射文件中:

<mapper namespace="com.ffyc.mybatispro.dao.AdminDao"></mapper>

通过这个我们就知道调用的这给类中的接口

以及

 <select id="findAdminByid" parameterType="int" resultType="Admin">select * from admin where id =#{id}
</select>

在这里mybatis框架中就会把查询到的数据映射到Admin这个类中,在这里我们就会产生一个疑惑为什么这样呢?

实际上市MyBatis在底层中实现了java反射机制。那什么是java反射机制,下面是一个简单的入门级的介绍。

反射机制概念

在运行状态中,在仅知道一给类名时,就可以动态获得类中信息,创建类对象,调用对象成员的机制就称为Java反射机制。

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

作用:动态获取类的信息

Class类

Java.lang.Class

Class类的对象,表示当前正在运行中的类和接口,Class类是实现java反射的基础

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

 

Java反射相关API

Java反射机制的相关类主要有:

Class类,Constructor类 获得构造方法,Method类 获得方法,Field类 获得属性

 获得Class对象

通过全类名获得Class对象(有三种方法)

String classname="com.ffyc.javaReflect.User";

方式一:通过Class类中的属性formname(String classname)(Class类的静态方法)

Class clazz=Class.forName(classname);

方式二:类名.class,适用于通过类名获得Class对象

//方式2
Class clazz2 = User.class;

方式三:Object类中的getClass方法:适用于通过对象获得Class实例的情况

//方式3
User user=new User();
Class clazz3 = user.getClass();

获得相应类的构造方法

有四种方式

Class aClass=Class.forName(classname);

通过Class类中的getConstructor()获得相应类的构造方法

//获得类的构造方法,通过构造方法api中的方法创建对象Constructor constructor1 = aClass.getConstructor();//获得指定的公共构造方法

String.class表示:参数是String类型(这里需要什么类型,转换成什么即可)

Constructor constructor2 = aClass.getConstructor(String.class,String.class);//获得有参构造方法

 getConstructors()获得所有公共的构造方法放到Constructor数组中

Constructor [] constructors=aClass.getConstructors();//获得所有公共的构造方法

getDeclaredConstructor()和getDeclaredConstructors()

//虽然可以获得私有构造方法,但是一般不建议操作私有成员,因为打破了封装性
aClass.getDeclaredConstructor();//获得类中任意构造方法,包括私有的
aClass.getDeclaredAnnotations();//获得类中所有构造方法,包括私有的

 获得相应类的方法

有四种方式

参数表示是类方法的名称

Method method = aClass.getMethod(String name)

 其它三个获取类方法的方式

//获得类中所有公共的成员方法,返回值是一个Method类数组
aClass.getMethods();
//获得类中的任意成员方法,包括私有的,返回值是一个Method类
aClass.getDeclaredMethod("eat");
//获得类中所有成员方法,包括私有的,返回值是一个Method类数组
aClass.getDeclaredMethods();

调用方法执行程序,这里的object表示要通过那个对象来调用这个方法

//调用方法使用invoke调用
method.invoke(object );

 获得类的成员变量

有四种方式

方式一

Field accountField= aClass.getField("account");//获得指定名称的公共成员变量

方式二

Field accountField= aClass.getDeclaredField("account");//获得指定名称的成员变量,包含私有的

方式三

Field[] fields= aClass.getDeclaredFields();//获得类中所有的成员变量,包含私有的

方法四

Field[] fields1=aClass.getFields();//获得类中所有公共的成员变量

如果想要操作私有变量,则需要setAccessible(true),改为false则程序报错

f.setAccessible(true);//允许访问操作私有变量

模拟在数据库查询到数据,赋值给对象

 //模拟数据库中查到的数据HashMap<String,String> map=new HashMap<>();map.put("account","admin");map.put("password","111");
Field[] fields= aClass.getDeclaredFields();//获得类中所有的成员变量,包含私有的for (Field f:fields){f.setAccessible(true);//允许访问操作私有变量f.set(object,map.get(f.getName()));}System.out.println(object);

结果:

为了能够更好的熟悉Java反射机制练习俩个实例

第一个,给私有成员变量赋值,不使用可以操作私有的属性的方法,

package com.ffyc.javaReflect;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;public class Test5 {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {//使用反射机制时,只知道类的名称(包名+类名)String classname="com.ffyc.javaReflect.Car";//1、通过类名获得类的Class对象Class aClass=Class.forName(classname);//通过类的Class对象来创建对象Object object = aClass.newInstance();//通过属性的set、get对私有属性赋值HashMap<String,String> map=new HashMap<>();map.put("name","奔驰");map.put("color","白色");//先拿到类中的所有私有属性Field[] fields= aClass.getDeclaredFields();for (Field field:fields){//根据属性名生成set方法名称String setMethod ="set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);System.out.println(setMethod);//通过class对象,获得对应的set方法对象Method setMethodObj =aClass.getMethod(setMethod,field.getType());//调用set方法setMethodObj.invoke(object,map.get(field.getName()));}System.out.println(object);}
}

 

第二个是一个简单转为json字符串

package com.ffyc.javaReflect;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ToJsonUtil {public static String toJson(Object object1) throws  IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {Class aClass=object1.getClass();String json="{";//获取类中的属性变量Field [] fields= aClass.getDeclaredFields();for (Field field:fields){String getMethod="get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);//拿到get方法Method method = aClass.getMethod(getMethod);//调用get方法String value = (String) method.invoke(object1);json+=field.getName()+":"+value+",";}json=json.substring(0,json.length()-1);json+="}";return json;}public static void main(String[] args) throws  NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {User user=new User();user.setAccount("admin");user.setPassword("111");Car car=new Car("奔驰","白色");System.out.println(toJson(user));System.out.println(toJson(car));}
}

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

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

相关文章

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

量化四大邪术之一:般若波罗蜜

网络相传亚洲有四大邪术&#xff0c;日本化妆&#xff0c;韩国整容&#xff0c;泰国变X&#xff0c;Z国PS。 这些都是让人在颜值上看起来很美&#xff0c;类似地&#xff0c;在量化交易领域&#xff0c;也有四大邪术能让净值曲线看起来很美&#xff0c;今儿个来说量化四大邪术当…

一文弄懂MySQL中的锁

MySQL中的锁概述 MySQL中的锁机制是数据库管理系统用于控制并发操作的一种手段&#xff0c;主要用于保证数据的一致性和完整性。当多个事务同时操作同一数据时&#xff0c;锁机制可以防止数据冲突和确保事务的隔离性。 在MySQL中&#xff0c;锁可以分为三大类&#xff1a;全局…

前端自动导入依赖

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题&#xff0c;因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源&#xff0c;同时保持高度的安全性和合规性。以下是一些关键技术和实践方法&#xff0c;用于实现跨云环境下的自动化身份管理…

Go学习笔记(一)语法

标准库文档&#xff1a;Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 B站课程&#xff1a;8小时转职Golang工程师(如果你想低成本学习Go语言) 课程作者语雀&#xff08;首页有更多内容&#xff09;&#xff1a;8小时转职Golang工程师 语雀 代码仓…

关于武汉芯景科技有限公司的多协议收发芯片XJ526(第二篇RS422模式)开发指南(兼容SP526)

一、设置芯片为RS422模式 SP526 包含高度集成的串行收发器。SP526 提供 RS-232 &#xff08;V.28&#xff09;、RS-423 &#xff08;V.10&#xff09;、RS-422 &#xff08;V.11&#xff09; 和 RS-485 的硬件接口模式。接口模式选择通过两个控制引脚D0、D1完成。 我们将D0接…

『功能项目』摄像机跟随角色【07】

我们打开上一篇06新输入系统项目&#xff0c; 本章要做的事情是摄像机跟随主角移动&#xff0c; 给主角增加一个Player标签方便主摄像机查找主角对象 在编辑场景调好角度&#xff0c;选择Main Camera对象按键盘Ctrl Shift F使运行场景与编辑场景相同 新建CameraCtrl脚本代码 …

玄机又成国漫首创!IP与AI融合,凭实力火出圈

现在国漫越来越卷了&#xff0c;不仅卷制作质量&#xff0c;还卷各种花式联动。最近玄机科技和百度文库联合举办的AI漫画大赛圆满结束&#xff0c;这还是国内的IP第一次和AI技术融合&#xff0c;而且产出了不少好作品。下面就一起来看看吧&#xff01; 提到玄机科技&#xff0c…

若依权限控制前端+后端实现思路梳理(PreAuthorize、hasPermi、v-hasPermi)

一、权限控制引发的思考 引言 最近接手了公司的一个项目&#xff0c;实施反馈说&#xff0c;客户那边要求对不同的权限的用户操作权限做限制。场景就是&#xff0c;比如一个项目列表&#xff0c;这部分数据有可能是针对某个公司某个部门的&#xff0c;对应不同的部门用户能看…

【Kotlin设计模式】Kotlin实现装饰器模式

前言 装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff0c;用于动态地为对象添加新功能&#xff0c;而无需修改其结构&#xff0c;通过使用不用装饰类及这些装饰类的排列组合&#xff0c;可以实现不同的功能和效果&#xff0c;但是这样的效果就是会增加很多类&…

Cypress第二次安装遇到的问题

问题一&#xff1a;吐血&#xff0c;谁会想到node.js的官网访问不了呢&#xff01; 中文网站&#xff1a;http://url.nodejs.cn/download/ 官网&#xff1a;https://nodejs.org/zh-cn nodejs安装的两种方法(官网、NVM安装-node版本切换)不知道这种方式是否可行&#xff0c;还…

62. 不同路径 -dp6

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/unique-paths/ 输入&#xff1a;m 3, n 2 输出&#xff1a;3 解释&a…

汽车功能安全--TC3xx LBIST触发时机讨论

目录 1. LBIST架构 2. LBIST寄存器配置 3. LBIST触发时机 LBIST&#xff0c;全称Logic Built-in Self Test。 在TC3xx中&#xff0c;LBIST是一种硬件功能安全机制&#xff0c;目的是为了探测MCU内部逻辑电路的潜伏故障(latent faults)。 从使用者角度来看&#xff0c;只需…

基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的图像质量评估功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的图像质量评估模块…

63. 不同路径 II -dp7

63. 不同路径 IIhttps://leetcode.cn/problems/unique-paths-ii/ 输入&#xff1a;obstacleGrid [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;2 解释&#xff1a;3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径&#xff1a; 1. 向右 -> 向右 ->…

对各项数据的统计汇总,集中展示,便于查看厂区情况的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

关于kafka的分区和消费者之间的关系

消费者和消费者组 当生产者向 Topic 写入消息的速度超过了消费者&#xff08;consumer&#xff09;的处理速度&#xff0c;导致大量的消息在 Kafka 中淤积&#xff0c;此时需要对消费者进行横向伸缩&#xff0c;用多个消费者从同一个主题读取消息&#xff0c;对消息进行分流。 …

yolov8 安装流程

1、克隆远端代码 git clone https://gitcode.com/gh_mirrors/ul/ultralytics.git 2、配置pyshon环境安装 3.10的版本&#xff0c;注意3.12后期会出现标注都在顶部的问题 使用idea可以在项目结构中直接添加python SDK 3、下载依赖&#xff0c;安装8.0210&#xff0c;注意新依赖…

脑靶向肽 ;SHp ;CLEVSRKNC ;缺血归巢肽

【脑靶向肽 SHp 简介】 SHp多肽是一种抗肿瘤多肽&#xff0c;它可以通过激活P53基因&#xff0c;调节细胞凋亡相关基因的蛋白表达&#xff0c;从而抑制肿瘤细胞的增殖并诱导细胞凋亡。在最新的研究中&#xff0c;SHp多肽被发现可以促进T细胞对肿瘤细胞的杀伤作用&#xff0c;显…