MyBatis中将结果集封装到指定类型详解(反射Class.forName详解)

2023-11-19

1.将结果集封装到指定类型中

1.1指定类型:

1.2将信息存入到mapper中

mapper的构造:成员变量:``

private String queryString;//SQL    select * from user
private String resultType;//实体类的全限定类名 com.domain.User

1.3反射

1.3.1获取全限定类名,加载类并且实例化

object obj = Class.forName(mapper.getResultType())newInstance();//加载参数指定的类到内存

1.3.2执行SQL语句,生成的结果集获取元信息,把每列的数据存入到指定类型中

1.4Class.forName方法扩展

理解 Class.forName()

Class 类概念

Class 也是一个 Java 类,保存的是与之对应 Java 类的 meta信息(元信息),用来描述这个类的结构,比如描述一个类有哪些成员,有哪些方法等,一般在反射中使用。

**详细解释:**Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例(Class 对象)。也就是说,在 Java 中,每个 java 类都有一个相应的 Class 对象,用于表示这个 java 类的类型信息。

类加载概念

当使用一个类的时候(比如 new 一个类的实例),会检查此类是否被加载到内存,如果没有,则会执行加载操作。

读取类对应的 class 文件数据,解析此数据,构造一个此类对应的 Class 类的实例。此时JVM就可以使用该类了,比如实例化此类,或者调用此类的静态方法。

Java 也提供了手动加载类的接口,class.forName()方法就是其中之一。(说来说去,其实就是生成这个类的 Class)

类加载器的概念

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。 基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。

类初始化概念

类被加载之后,jvm 已经获得了一个描述类结构的 Class 实例。但是还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块

Class.forName() 方法

此方法含义是:加载参数指定的类,并且初始化它

在 jdbc 连接数据库中的应用

到这里,不用解释,读者也会明白,在使用 jdbc 方式连接数据库时,为什么要执行 Class.forName(‘驱动类名’) 方法了:将驱动类的 class 文件装载到内存中,并且形成一个描述此驱动类结构的 Class 类实例,并且初始化此驱动类,这样 jvm 就可以使用它了,这就是 Class.forName() 方法的含义。

有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用 newInstance() 方法呢?即有的 jdbc 连接数据库的写法里是 Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?

刚才提到,Class.forName(" "); 的作用是要求 JVM 查找并加载指定的类,如果在类中有静态初始化器的话,JVM 必然会执行该类的静态代码 段。而在 JDBC 规范中明确要求这个 Driver 类必须向 DriverManager 注册自己,即任何一个 JDBC Driver 的 Driver 类的代码都必须类似如下:

public class MyJDBCDriver implements Driver { 
    static { 
        DriverManager.registerDriver(new MyJDBCDriver()); 
    } 
} 

既然在静态初始化器的中已经进行了注册,所以我们在使用 JDBC 时只需要 Class.forName(XXX.XXX); 就可以了。

Class.forName() 与 xxx.class的区别

所有的类都是在对其第一次使用时,动态加载到 JVM。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这也证明了构造器也是类的静态方法,即使在构造器之前并没有 static 关键字。因此,使用 new 操作符创建类的对象也会被当作对类的静态成员的引用。

因此 Java 程序在他开始运行之前并非被完全加载,其各个部分是在需要时才加载的。

类加载器首先槛车这个类的 Class 对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名称查找 .class 文件。在这个类的字节码被加载时,它们会接收验证,以确保其没有被破坏。

Class 对象尽在需要的时候才被加载。static 初始化是在类加载时进行的

对于 Class.forName(),这个方法是 Class 类的一个 static 成员。Class 对象就和其他对象一样,我们可以获取并操作他的引用。forName() 是取得 Class 对象引用的一种方法。他是用一个包含目标类的文本名的 String 作为输入参数,返回一个 Class 对象的引用。forName() 方法发现某个累还没被加载,就会主动去加载这个类,在加载过程中,该类的是 static 子句将会被执行。

Java 还提供了另一种方法来生成对 Class 对象的引用,即使用类字面常量。形如:xxx.class 的形式。但是这种形式创建 Class 对象引用时,不会自动初始化 Class 对象。初始化被延迟到了对静态方法或者非常数静态域首次引用时才执行。

从对 initable 引用的创建中可以看到,仅使用 .class 语法来获取对类的引用不会发生初始化。但是 Class.forName() 立即就进行了初始化。如果一个 static final 值是“编译期常量”,就像 Initable.staticFinal 那样,那么这个值不需要对 Initable 类进行初始化就可以被读取。但是如果只是将一个域设置为 static 和 final 的,还不足以确保这种行为,例如 Initable.staticFianl2 的访问将强制进行类型的初始化,因为他不是一个编译器常量。

小结:

Class.forName(“ ”) 加载参数到内存,返回一个class(类)对象,并且初始化该类

初始化和实例化的区别:

初始化时机:进入main方法前先会加载jdk基础类和main方法所在的类

​ 其他的类只有被使用到的时候才会被加载

实例化的方式:由执行类实例创建表达式而引起的对象创建(new)。除此之外,我们还可以使用反射机制(Class类的newInstance方法、使用Constructor类的newInstance方法)、使用Clone方法、使用反序列化等方式创建对象

初始化:类加载进来的时候就会对其初始化,静态变量(类加载器),静态代码块,构造器都会加入进内存

e方法、使用Constructor类的newInstance方法)、使用Clone方法、使用反序列化等方式创建对象

初始化:类加载进来的时候就会对其初始化,静态变量(类加载器),静态代码块,构造器都会加入进内存

实例化;一般是先对其初始化再实例化,将类的所有信息加载进内存

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis中将结果集封装到指定类型详解(反射Class.forName详解) 的相关文章

  • 对接微信支付(二)统一下单API

    原创文章 对接微信支付 二 统一下单API 编程屋 大家可以先想一下 大家平时在PC端发起的支付都需要什么 是不是你选好商品之后 点击支付 然后PC端弹出来一个二维码 你扫码付款 付款完成之后就OK了 当然这只是针对我们用户来说的 对于我们

随机推荐

  • 什么是数字孪生技术?

    数字孪生是实体对象的虚拟模型 它跨越对象的生命周期 并使用从对象上的传感器发送的实时数据来模拟行为并监控操作 数字孪生可以复制许多现实世界中的物品 从工厂中的单台设备到完整的装置 例如风力涡轮机 甚至整个城市 数字孪生技术使您能够监督资产的
  • 毕业设计-基于机器视觉深度学习船只船舶检测

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • Idea设置maven依赖自动导入

    maven自动导入 setting gt Build gt Build Tools gt Any changes
  • mmocr环境配置

    win10 显卡3070 创建名为mmocr的环境 conda create n mmocr python 3 7 y 激活mmocr conda activate mmocr 失败了 安装完事竟然是cpu版本 没找到原因 本人3070显卡
  • SpringBoot 图片上传(详解篇)

    前言 SpringBoot在服务器内上传文件 是临时文件 在重启时候会生成另外的目录 也就意味着原来上传的图片在重启后就访问不到了 1 图片上传 PostMapping upload public CommonResult insertDb
  • [人工智能-深度学习-77]:目标检测 - 常见项目、应用

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122307915 目录 前言 场景一
  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • 企业级体验:未来体验管理的价值与趋势

    我从事企业级体验相关领域的工作已十六载有余 曾经就职的企业既有阿里巴巴 腾讯这样的互联网 大厂 也有顺丰 龙湖这样的线下 传统 企业 在这些企业中 我所工作的场景横跨了软件 电商 互联网 物流 零售 地产 金融等诸多业务领域 为不同业务场景
  • freeImage图像旋转滤波

    原文 http www cnblogs com wangshide archive 2012 04 25 2470693 html 1 使用了 freeImage 图像库进行图像读取 保存 如何将图片转为矩阵 如何处理图片的颜色 rgb 透
  • pandas笔记(10)——数据导出

    导出excel 格式 to excel excel writer sheet name Sheet1 na rep float format None columns None header True index True index la
  • springcloud-eureka集群-整合hystrix框架整合feign

    继之前的项目继续扩展 整合hystrix和feign这两个框架 1 修改服务器调用者的application yml 增加如下代码 打开feign对hystrix的支持 feign hystrix enabled true 配置hystri
  • STM3利用FATFS向SD卡文件追加数据的三种方法

    1 f sync SDFile 该方法简单粗暴 适合一直连续向sd卡中写入数据 while之前就f open 循坏内重复 向缓存填充数据 gt 写入数据 gt 刷新写入 整个过程并没有f colse retSD f open SDFile
  • Win10 LTSB/LTSC 录音机、图片查看器、便签

    Win10 LTSB LTSC 录音机 图片查看器 便签 文章目录 Win10 LTSB LTSC 录音机 图片查看器 便签 示例 录音机 图片查看器 便签 示例 文件下载地址 链接 https pan baidu com s 1YYwh9
  • etree.html 报错 AttributeError:‘function’ object has no attribut ‘HTML’

    etree html 报错 1 Pycharm 中lxml没有etree模块的解决方法 之前是 from lxml import etree tree etree HTML python 3 5以上版本lxml中没有了etree 要换另外一
  • Windows 环境下安装C语言运行环境

    STEP1 下载min gw 下载地址 https sourceforge net projects mingw files STEP2 点击 mingw get setup exe安装 安装目录可以自己选择 但是要记住 后面添加环境变量需
  • 离散数学---期末复习知识点

    一 数理逻辑 复习知识点 1 命题与联结词 否定 析取 合取 蕴涵 等价 命题 非真既假的陈述句 复合命题 由简单命题通过联结词联结而成的命题 2 命题公式与赋值 成真 成假 真值表 公式类型 重言 矛盾 可满足 公式的基本等值式 3 范式
  • 机器学习编程作业-逻辑回归

    逻辑回归 作业说明 复习 任务一 使用逻辑回归辨别真假钞票 任务二 使用逻辑回归对电影评论分类 作业说明 任务一 使用逻辑回归辨别真假钞票 钞票数据集 Banknote Dataset 涉及根据给定钞票的数个度量的照片预测是真钞还是假钞 它
  • vue-element-admin项目

    vue element admin vue element admin 介绍 功能 前序准备 目录结构 项目运行机制和代码注释 main js App vue permission js Vuex结构 scss icons 安装 Contr
  • 密码学之DES算法简述(1)

    1 DES算法描述 1 输入64位明文数据 并进行初始置换IP 2 在初始置换IP后 明文数据再被分为左右两部分 每部分32位 以L0 R0表示 3 在秘钥的控制下 经过16轮运算 f 4 16轮后 左 右两部分交换 并连接再一起 再进行逆
  • MyBatis中将结果集封装到指定类型详解(反射Class.forName详解)

    文章目录 1 将结果集封装到指定类型中 1 1指定类型 1 2将信息存入到mapper中 1 3反射 1 3 1获取全限定类名 加载类并且实例化 1 3 2执行SQL语句 生成的结果集获取元信息 把每列的数据存入到指定类型中 1 4Clas