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

每日三个JAVA经典面试题(三十四)

1.Mybatis的一级、二级缓存

MyBatis提供了两种缓存机制来提高查询效率:一级缓存和二级缓存。

一级缓存(Session级别)

  • 作用范围:一级缓存是基于SqlSession的。这意味着,如果你在同一个SqlSession中执行两次相同的查询,MyBatis会从第一次查询时创建的缓存中返回结果,而不是再次访问数据库。
  • 生命周期:一级缓存的生命周期与SqlSession一致。当SqlSession被关闭或清除时,一级缓存也随之失效。

二级缓存(Mapper级别或全局级别)

  • 作用范围:二级缓存是基于Mapper的,也就是说,它是跨SqlSession的。如果不同的SqlSession执行相同的Mapper和SQL查询,它们可以共享二级缓存中的数据,前提是二级缓存已经被开启并正确配置。
  • 生命周期:二级缓存从SqlSession开始,直到应用会话结束或缓存被清除。这意味着,二级缓存可以在不同用户或请求间共享数据,从而减少数据库的访问次数,提高应用性能。

工作原理

  1. 一级缓存:当一个SqlSession进行了一次数据库查询后,结果会存储在这个会话的一级缓存中。如果同一个会话中有相同的查询请求,MyBatis将直接从一级缓存返回数据。
  2. 二级缓存:如果一个查询在一级缓存中没有找到匹配,MyBatis将查找二级缓存。如果结果存在,将直接从二级缓存返回。如果两级缓存都未命中,MyBatis将执行数据库查询,并将结果存入适当的缓存中。

注意事项

  • 默认情况下,一级缓存总是开启的,而二级缓存需要显式开启和配置。
  • 使用二级缓存时,需要考虑数据的一致性问题。因为数据是跨会话共享的,所以在并发环境下可能会出现数据过时的情况。
  • 对于频繁修改的数据,谨慎使用二级缓存,以避免脏读等问题。

通过合理使用和配置这两级缓存,可以在保持数据一致性的同时,显著提升应用的性能。

2.反射机制的应用场景有哪些?

反射机制,在Java中是一种强大的工具,允许程序在运行时访问、检测和修改其自身类的属性和方法。通过反射,可以实现在运行时动态创建对象、调用方法和访问属性,即使这些信息在编译时是未知的。这种机制不仅增加了程序的灵活性,也使得各种通用框架和API的实现成为可能。以下是一些典型的反射机制应用场景:

1. 开发IDE或工具

  • 反射用于开发集成开发环境(IDE)和其他开发工具中,比如在调试时动态地查看和修改对象的状态,或是在代码补全时提供方法和属性的列表。

2. 实现依赖注入(DI)

  • 许多现代框架(如Spring)使用反射来实现依赖注入。框架可以在运行时读取类的注解和属性,自动将依赖对象注入到其中,而无需手动编写工厂类或创建对象。

3. ORM(对象关系映射)

  • ORM框架如Hibernate利用反射将数据库表映射到Java对象。这允许开发者通过操作对象来间接操作数据库中的数据,而不是直接编写SQL语句。

4. 单元测试

  • 单元测试框架(如JUnit)使用反射来动态执行测试方法。开发者只需按照一定的规则编写测试方法,测试框架会自动发现并执行这些方法,而不需要手动列出每个测试调用。

5. 动态代理

  • 在实现动态代理时,反射机制允许在运行时动态创建一个实现了一组给定接口的新类。这对于实现各种代理模式(如远程方法调用、事务管理等)非常有用。

6. 插件或模块加载

  • 应用程序可以使用反射来动态加载外部的插件或模块,这些插件或模块在编译时可能是未知的。这增加了应用程序的扩展性和灵活性。

7. 配置文件解析

  • 反射常用于解析XML或JSON等配置文件,动态地创建配置文件中描述的对象和设置其属性值,而无需为每种可能的配置编写大量的解析代码。

8. GUI构建

  • 图形用户界面(GUI)构建工具可以使用反射来检查组件类的属性,动态地创建用户界面元素,允许开发者通过配置而非硬编码的方式来设计界面。

小结

反射机制使Java程序具有更高的灵活性和动态性,是许多高级特性和框架实现的基础。但是,也需要注意,不当的使用反射可能会带来性能问题和安全风险,因此在使用时应该权衡其利弊。

3.Java获取反射的三种方法

在Java中,获取类的Class对象是进行反射操作的第一步。有三种主要方式可以获取到一个类的Class对象,每种方式适用于不同的场景:

1. 使用Class.forName()静态方法

这种方法通过类的完全限定名(包括包名)来加载类,并返回类的Class对象。这是一种动态加载类的方式,常用于配置文件中指定类名的场景,使得你可以在不改变程序代码的情况下更换实现类。

Class<?> cls = Class.forName("java.lang.String");

这个方法抛出ClassNotFoundException异常,因此需要进行异常处理。

2. 使用.class语法

如果在编译时已经知道具体的类,可以直接使用.class语法来获取Class对象。这种方式不涉及类的动态加载,因此性能较好,但它不如Class.forName()灵活。

Class<?> cls = String.class;

这种方法不会抛出ClassNotFoundException异常。

3. 使用类实例的.getClass()方法

如果你已经有了一个类的实例,可以通过调用该实例的.getClass()方法来获取Class对象。这种方式适用于当你有对象实例时,想要动态获取其类型信息的场景。

String str = new String();
Class<?> cls = str.getClass();

这种方式也不会抛出ClassNotFoundException异常。

总结

  • Class.forName():适用于动态加载类,需要处理ClassNotFoundException
  • .class语法:适用于编译时已知类的情况,性能较好,但不够灵活。
  • .getClass()方法:适用于已有对象实例,想要获取其Class对象的场景。

选择哪种方式取决于你的具体需求和场景。在使用反射时,应当注意性能和安全性问题,合理选择获取Class对象的方法。

相关文章:

每日三个JAVA经典面试题(三十四)

1.Mybatis的一级、二级缓存 MyBatis提供了两种缓存机制来提高查询效率&#xff1a;一级缓存和二级缓存。 一级缓存&#xff08;Session级别&#xff09; 作用范围&#xff1a;一级缓存是基于SqlSession的。这意味着&#xff0c;如果你在同一个SqlSession中执行两次相同的查询…...

C# 学习第五弹——语句

一、if语句 —简单if语句 —if else 语句 —if else if else 语句 1、简单if语句 if&#xff08;表达式&#xff09;{语句} &#xff08;1&#xff09;表达式必须使用圆括号括起来&#xff1b; &#xff08;2&#xff09;表达式&#xff1a;关系表达式或逻辑表达…...

什么是Java中的JVM(Java虚拟机)?它如何工作?

Java中的JVM&#xff0c;全称Java Virtual Machine&#xff08;Java虚拟机&#xff09;&#xff0c;是Java程序的运行环境&#xff0c;也是Java语言的核心和基础。它是一个虚拟的计算机&#xff0c;具有完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;以及相应…...

OmniGraffle Pro for mac 出色的图形设计软件

OmniGraffle Pro是一款非常出色的图形设计软件&#xff0c;它主要适用于Mac和iPad平台&#xff0c;可以用来轻松绘制各种精美的图表、示意图和界面设计。 软件下载&#xff1a;OmniGraffle Pro for mac中文注册激活版 以下是OmniGraffle Pro的一些主要特点和功能&#xff1a; 界…...

代码随想录阅读笔记-二叉树【合并二叉树】

题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们的值相加作为节点合并后的新值&#xff0c;否则不为 NULL 的节…...

Day35:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 四、 搭建平台管理端前端环境 权限管理模块-用户管理 开发为用户分配角色接口用户管理前端测试 权限管理模块-菜单管理 菜单管理需求菜单表设计开发菜单管理CRUD接口开…...

c模板编程c/c++20240401

c模板编程 #include<iostream> //#include<string> //#include<algorithm> template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { int i max(1, 2); // 返回 2 float f max(3.14f, 2.72f); // 返回 3…...

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG&#xff0c;选择xwr68xx还是xwr64xx&#xff0c;及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…...

连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案

1. 问题背景 调整redis的配置后&#xff0c;启动程序时&#xff0c; 会报如下错误&#xff1a; [redis://172.16.0.8xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster supp…...

什么是json?json可以存放哪几种数据类型

JSON指的是JavaScript对象表示法(avaScript Object Notation)&#xff0c;是轻量级的文本数据交换格式&#xff0c;独立于语言: JSON使用JavaScript语法来描述数据对象&#xff0c;但是JSON仍然独立于语言和平台&#xff0c;JSON解析器和JSON库支持许多不同的编程语言&#xff…...

网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】

目录 前提知识 1. 理解源ip&#xff0c;目的ip和Macip 2. 端口号 3. 初识TCP&#xff0c;UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型 一&#xff0c;基于udp协议编程 1. socket——创建套接字 2. bind——将套接字强绑定 3. recvfrom——接受数据 4. s…...

有关数据开发项目中使用HIVE由于无法update和delete的场景下,如何解决数据增量的思路

解决数据增量问题的思路在Hive中 在数据开发项目中&#xff0c;使用Hive进行数据处理时&#xff0c;由于Hive不支持update和delete语句&#xff0c;处理数据增量可能会变得有些棘手。然而&#xff0c;有几种策略和技术可以帮助我们解决这个问题&#xff0c;并确保数据增量的高…...

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…...

视觉检测系统,外观细节无可挑剔

在传统行业中&#xff0c;利用人工检测来检测产品外观缺陷依然是主流&#xff0c;但由于竞争的加剧&#xff0c;对企业生产效率的要求也越来越高。传统的检测产品外观缺陷问题的方法就是透过人工目检&#xff0c;或者工人采用游标卡尺等工具检测&#xff0c;此种方式检测速度慢…...

C++中string容器的字符串操作

目录 1.c_str() 返回C常量字符串 2.date() 返回C常量字符串 3.substr() 构造子串 4.find() 正向查找&#xff08;查找失败返回npos&#xff09; 5.rfind() 逆向查找&#xff08;查找失败返回npos&#xff09; 6.find_first_of() 正向查找匹配的字符 7.find_last_of() 逆向…...

Java编程使用CGLIB动态代理介绍与实战演示

文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中&#xff0c;CGLIB (Code Generation Library) 是一个强大的高性能代码生成库&#xff0c;它通过生…...

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…...

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…...

手机无线投屏到windows11电脑

1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...