深入浅出Java反射:掌握动态编程的艺术
- 小程一言
- 反射
- 何为反射
- 反射核心类
- 反射的基本使用
- 获取`Class`对象
- 创建对象
- 调用方法
- 访问字段
- 示例程序
- 应用场景
- 优缺点分析
- 优点
- 缺点
- 注意
- 再深入一些
- 反射与泛型
- 反射与注解
- 反射与动态代理
- 反射与类加载器
- 结语
小程一言
本专栏是对Java知识点的总结。在学习Java的过程中,学习的笔记,加入自己的思考,结合各种资料的整理。
文章与程序一样,一定都是不完美的,因为不完美,才拥有不断追求完美的动力
以下是符合您要求的博客文章,主类名为crj
,内容全面细致,深度适中,字数约5000字。
反射
Java反射是Java语言中一项强大的功能,它允许程序在运行时动态地获取类的信息并操作类的属性、方法和构造方法。反射机制为Java提供了极大的灵活性,广泛应用于框架开发、动态代理、注解处理等场景。本文将详细介绍Java反射的核心概念、使用方法以及注意事项,并通过示例代码帮助读者更好地理解。
何为反射
简单来说,反射是指在程序运行时,能够动态地获取类的信息(如类名、方法、字段、构造方法等),并能够操作这些信息。通过反射,我们可以在运行时创建对象、调用方法、访问字段,甚至修改私有成员的值。
反射的核心类是java.lang.reflect
包中的Class
、Method
、Field
和Constructor
。通过这些类,我们可以实现动态编程。
反射核心类
Class<T>
: 表示一个类或接口的类型信息。通过Class
对象可以获取类的构造方法、方法和字段。Constructor<T>
: 表示类的构造方法,用于创建对象。Method
: 表示类的方法,用于调用方法。Field
: 表示类的字段,用于访问或修改字段的值。
反射的基本使用
获取Class
对象
要使用反射,首先需要获取目标类的Class
对象。以下是三种常见的获取方式:
Class.forName("全限定类名")
: 通过类的全限定名获取Class
对象。对象.getClass()
: 通过对象实例获取Class
对象。类名.class
: 直接通过类名获取Class
对象。
// 示例:获取String类的Class对象
Class<?> clazz = Class.forName("java.lang.String");
创建对象
通过Class
对象可以获取类的构造方法,并调用newInstance()
方法创建对象。
// 示例:通过反射创建String对象
Class<?> clazz = Class.forName("java.lang.String");
Constructor<?> constructor = clazz.getConstructor(); // 获取无参构造方法
Object obj = constructor.newInstance(); // 创建对象
System.out.println("创建的对象: " + obj);
调用方法
通过Class
对象可以获取类的方法,并调用invoke()
方法执行方法。
// 示例:通过反射调用String的length()方法
Class<?> clazz = Class.forName("java.lang.String");
Method method = clazz.getMethod("length"); // 获取length()方法
int length = (int) method.invoke("Hello"); // 调用方法
System.out.println("字符串长度: " + length);
访问字段
通过Class
对象可以获取类的字段,并访问或修改字段的值。
// 示例:通过反射访问Integer的value字段
Class<?> clazz = Class.forName("java.lang.Integer");
Field field = clazz.getDeclaredField("value"); // 获取value字段
field.setAccessible(true); // 设置可访问私有字段
int value = (int) field.get(10); // 获取字段值
System.out.println("字段值: " + value);
示例程序
以下是一个完整的示例程序,展示了如何使用反射创建对象、调用方法和访问字段。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class crj {public static void main(String[] args) {try {// 1. 获取Class对象Class<?> clazz = Class.forName("java.lang.String");// 2. 创建对象Constructor<?> constructor = clazz.getConstructor();Object obj = constructor.newInstance();System.out.println("创建的对象: " + obj);// 3. 调用方法Method method = clazz.getMethod("length");int length = (int) method.invoke("Hello");System.out.println("字符串长度: " + length);// 4. 访问字段Class<?> integerClass = Class.forName("java.lang.Integer");Field field = integerClass.getDeclaredField("value");field.setAccessible(true);int value = (int) field.get(10);System.out.println("Integer的value字段值: " + value);} catch (Exception e) {e.printStackTrace();}}
}
应用场景
- 动态代理: 在运行时创建代理对象,例如Spring AOP。
- 框架开发: 如Spring通过反射管理Bean的生命周期。
- 注解处理: 在运行时读取注解信息,例如JUnit的测试框架。
- 工具开发: 如IDE的代码提示功能。
优缺点分析
优点
- 灵活性高: 可以在运行时动态操作类和方法。
- 功能强大: 适用于框架和工具开发。
缺点
- 性能较低: 反射操作比直接调用慢。
- 破坏封装性: 可以访问私有成员,可能导致安全问题。
- 代码可读性差: 反射代码通常难以理解和维护。
注意
- 性能问题: 反射操作较慢,频繁使用时需谨慎。
- 安全性: 反射可以绕过访问控制,需确保代码的安全性。
- 异常处理: 反射操作可能抛出
IllegalAccessException
、InvocationTargetException
等异常,需妥善处理。
再深入一些
将能联系到的地方都牵连一下,希望能给你更多的思考
反射与泛型
Java反射机制在处理泛型时需要注意类型擦除的问题。由于Java的泛型是通过类型擦除实现的,因此在运行时无法直接获取泛型的具体类型信息。但是,可以通过ParameterizedType
等接口来获取泛型的信息。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class crj{public static class GenericClass<T> {public void printType() {Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println("泛型类型: " + type);}}public static void main(String[] args) {GenericClass<String> genericClass = new GenericClass<String>() {};genericClass.printType();}
}
反射与注解
Java反射机制可以用于读取和处理注解。通过反射,我们可以在运行时获取类、方法、字段上的注解信息,并根据注解的值执行相应的逻辑。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {String value();
}public class AnnotationReflectionExample {@MyAnnotation("Hello, Annotation!")public void annotatedMethod() {System.out.println("这是一个带有注解的方法");}public static void main(String[] args) throws Exception {Method method = AnnotationReflectionExample.class.getMethod("annotatedMethod");MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("注解值: " + annotation.value());}
}
反射与动态代理
Java反射机制在动态代理中扮演着重要角色。通过Proxy
类和InvocationHandler
接口,我们可以在运行时创建代理对象,并在调用方法时执行额外的逻辑。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface MyInterface {void doSomething();
}public class DynamicProxyExample {public static void main(String[] args) {MyInterface realObject = new MyInterface() {@Overridepublic void doSomething() {System.out.println("真实对象的方法");}};MyInterface proxyObject = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),new Class<?>[] { MyInterface.class },new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("方法调用前");Object result = method.invoke(realObject, args);System.out.println("方法调用后");return result;}});proxyObject.doSomething();}
}
反射与类加载器
Java反射机制与类加载器密切相关。通过自定义类加载器,我们可以在运行时动态加载类,并使用反射机制操作这些类。
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;public class CustomClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name);return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String className) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int bufferSize = 4096;byte[] buffer = new byte[bufferSize];int bytesRead;try {while ((bytesRead = inputStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}} catch (Exception e) {e.printStackTrace();}return byteArrayOutputStream.toByteArray();}public static void main(String[] args) throws Exception {CustomClassLoader customClassLoader = new CustomClassLoader();Class<?> clazz = customClassLoader.loadClass("com.example.MyClass");Object obj = clazz.getDeclaredConstructor().newInstance();Method method = clazz.getMethod("myMethod");method.invoke(obj);}
}
结语
Java反射是一项强大的功能,它为Java提供了动态编程的能力。通过反射,我们可以在运行时获取类的信息并操作类的成员。尽管反射具有很高的灵活性,但也存在性能和安全性的问题。在实际开发中,应根据需求合理使用反射,避免滥用。
希望本文能帮助你更好地理解Java反射机制!如果你有任何问题或建议,欢迎在评论区留言。
相关文章:
深入浅出Java反射:掌握动态编程的艺术
小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…...
exr 格式下 全景图(经纬图、panorama)转 cubemap
先上效果 (X, -X, Y, -Y, Z, -Z) 下载 exr 经纬图 笔者用的这张:https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky 使用 Openexr 的 exrenvmap 工具 下载 我 build 了一份 3.3.2 版本的,免积分下载。 https:/…...
解锁建造者模式:Java 编程中的对象构建秘籍
系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品(Product)2.2.2 建造者(Builder)2.2.3 具体建造者(ConcreteBuilder)2.2.4 指挥者(Director)2.3 工作流程与交互机制三、建造者模式在 Java 中的优势3.1 …...
ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全
ArcGIS Pro对于显示缓存有32GB的限制,所以当缓存设置中,缓存将达到32GB时,会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置,然后单击选项; 2.在选项窗口中&…...
大数据、云计算、人工智能等技术深度融合的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...
C++17 中的 std::reduce:详细教程
文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法,用于对范围内的元素进行归并操作。它…...
Python爬虫实战:获取笔趣阁图书信息,并做数据分析
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备与反爬策略 python import requests from bs4 import BeautifulSoup import pandas as pd import re import time import random from fake_useragent …...
win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法,以及后续使用夜神模拟器,关闭了Hyper-V时&am…...
c# sqlite 批量生成insert语句的函数
函数开始 using System; using System.Collections.Generic; using System.Text;public class SqliteHelper {public static List<string> GenerateInsertStatements(string tableName, List<string> columns, List<List<object>> data){List<stri…...
ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类
使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像,包括创建散点图和直方图,以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 3.1.x)添…...
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
导读:浙江霖梓早期使用 CDH 产品套件搭建了大数据系统,面临业务逻辑冗余、查询效率低下等问题,基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris Paimon 的实…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
2025年金三银四经典自动化测试面试题
概述 觉得自动化测试很难? 是的,它确实不简单。但是学会它,工资高啊! 担心面试的时候被问到自动化测试? 嗯,你担心的没错!确实会被经常问到! 现在应聘软件测试工程师的岗位&…...
遵循规则:利用大语言模型进行视频异常检测的推理
文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly (正常与异常)Abstract and Concrete (抽象与具体)Human and Environment (人类与环境) 3…...
RFM模型-数据清洗
在进行数据清洗时,主要的目标是确保数据质量良好,以便后续的分析和建模工作能够顺利进行。针对你使用粒子群优化算法改进RFM模型来对电商数据进行用户群像划分的实验,数据清洗环节尤其重要,因为不干净的数据会影响模型的精度和效果…...
文件系统惹(细)
目录 块概念 分区 inode ext2文件系统 Boot Sector Super Block GDP(group descriptor table) Block Bitmap(块位图) Inode Bitmap (inode位图) Data Block inode和Datablock映射 目录和文件名 …...
中望CAD c#二次开发 ——VS环境配置
新建类库项目:下一步 下一步 下一步: 或直接: 改为: <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...
Centos7安装Clickhouse单节点部署
部署流程 1、关闭防火墙&沙盒 关闭防火墙并关闭开机自启动 systemctl stop firewalld && systemctl disable firewalld查看selinux状态是否为disabled,否则修改 [rootlocalhost ~]# getenforce Enforcing修改为disabled vim /etc/selinux/config…...
4.SpringSecurity在分布式环境下的使用
参考 来源于黑马程序员: 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证,即我们常说的单点登录,简称SSO,指的是在多应用系统的项目中,用户只需要登录一次,就可以访 问所有互相信任的应…...
使用 Notepad++ 编辑显示 MarkDown
Notepad 是一款免费的开源文本编辑器,专为 Windows 用户设计。它是替代记事本(Notepad)的最佳选择之一,因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式,并可以通过插件扩展其功能。 Notepad 是一款功能…...
Spring 框架数据库操作常见问题深度剖析与解决方案
Spring 框架数据库操作常见问题深度剖析与解决方案 在 Java 开发的广阔天地中,Spring 框架无疑是开发者们的得力助手,尤其在数据库操作方面,它提供了丰富且强大的功能。然而,就像任何技术一样,在实际项目开发过程中&a…...
第一天:爬虫介绍
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…...
ECP在Successfactors中paylisp越南语乱码问题
导读 pyalisp:ECP中显示工资单有两种方式,一种是PE51,一种是hrform,PE51就是划线的那种, 海外使用的比较多,国内基本没人使用,hrform就是pdf,可以编辑pdf,这个国内相对使用的人 比…...
Express 中间件分类
一、 按功能用途分类 1. 应用级中间件 这类中间件应用于整个 Express 应用程序,会对每个进入应用的请求进行处理。通过 app.use() 方法挂载,可用于执行一些全局性的任务,像日志记录、请求预处理、设置响应头这类操作。 const express req…...
基于Multi-Runtime的云原生多态微服务:解耦基础设施与业务逻辑的革命性实践
引言:当微服务遭遇复杂性爆炸 在分布式系统复杂度指数级增长的今天,一线开发者平均需要处理27种不同的基础设施组件配置。CNCF最新研究报告指出,采用Multi-Runtime架构可减少83%的非功能性代码编写量,同时使分布式原语࿰…...
flutter isolate到底是啥
在 Flutter 中,Isolate 是一种实现多线程编程的机制,下面从概念、工作原理、使用场景、使用示例几个方面详细介绍: 概念 在 Dart 语言(Flutter 开发使用的编程语言)里,每个 Dart 程序至少运行在一个 Isol…...
Http connect timed out
客户向云端服务请求时,连接云端域名显示连接超时,为什么呢,偶尔会有。 java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketI…...
Flutter 异步编程利器:Future 与 Stream 深度解析
目录 一、Future:处理单次异步操作 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Future 3.2 使用 then 消费 Future 3.3 特性 二、Stream:处理连续异步事件流 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Stream 3.2 监听 Stream 3.…...
langchain实现的内部问答系统及本地化替代方案
主旨:问答系统搭建使用langchain要token,本文目的在于一、解析langchain调用过程,二、不使用langchain规避token,而使用本地化部署的方案方向。主要是本地向量化库的建立。 文章目录 主旨:问答系统搭建使用langchain要…...
“新旗手”三星Galaxy S25系列,再次定义了AI手机的进化方向
一年多前,三星Galaxy S24系列正式发布,作为首款由Galaxy AI赋能的AI手机,带来了即圈即搜、通话实时翻译、AI扩图等“神奇能力”。 彼时AI手机还是一个新物种,没有明确的产品定义,体验上也没有“标准答案”。三星Galax…...
JVM的类加载器
什么是类加载器? 类加载器:JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而Java 程序能够启动起来。 类加载器有哪些? 启动类加载器(BootStrap ClassLoader):加载JAVA HOME/jre/lib目录下的库…...
Node.js中的模块化:从原理到实践
目录 一、为什么需要模块化? 二、Node.js模块类型解析 2.1 核心模块 2.2 文件模块 2.3 第三方模块 三、CommonJS规范深度解析 3.1 模块加载原理 3.2 模块缓存机制 3.3 循环依赖处理 四、ES Modules新特性 4.1 基本用法 4.2 与CommonJS的差异比较 五、模…...
LLM论文笔记 6: Training Compute-Optimal Large Language Models
Arxiv日期:2022.3.29机构:Google DeepMind 关键词 scaling lawpower law参数量FLOPStokes 核心结论 1. 当前大多数大语言模型(如 GPT-3 和 Gopher)在计算预算分配上存在问题,模型参数过大而训练数据不足 2. 计算预算…...
数仓:核心概念,数仓系统(ETL,数仓分层,数仓建模),数仓建模方法(星型模型,雪花模型,星座模型)和步骤
数仓建模的核心概念 事实表(Fact Table): 存储业务过程的度量值(如销售额、订单数量等)。 通常包含外键,用于关联维度表。 维度表(Dimension Table): 存储描述性信息&…...
markdown|mermaid|typora绘制流程图的连接线类型怎么修改?
1、使用typora绘制流程图。别人例子里面的连线是圆弧,我的画出来就是带折线的 这是卖家秀: 这是买家秀: 无语了有没有? 犹豫了片刻我决定一探究竟(死磕)。 Typora --> 文件 --> 偏好设置 --》 mar…...
理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口
在 WebGPU 开发中, GPUDevice 是一个至关重要的对象,它是与 GPU 进行交互的核心接口。通过 GPUDevice ,开发者可以创建和管理 GPU 资源(如缓冲区、纹理、管线等),并提交命令缓冲区以执行渲染和计算任…...
庞氏骗局(Ponzi Scheme):金融投资与公司经营中的隐形陷阱(中英双语)
庞氏骗局:金融投资与公司经营中的隐形陷阱 庞氏骗局(Ponzi Scheme),这个词在金融史上屡见不鲜。从投资骗局到企业经营中的资本运作,庞氏骗局的核心逻辑始终如一:用后来的资金填补前面的缺口,营…...
【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取1k个用户token,使用jmeter压力测试
【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取用户token,使用jmeter压力测试 3.1 需求3.2 实现3.2.1 环境配置3.2.2 修改登录接口UserController和实现类3.2.3 测试类 3.3 使用jmeter进行测试3.4 测试结果3.5 将用户登录逻辑修改回去3.6 批量删除生成的用户…...
前端调用串口通信
项目录结构 node项目 1) 安装serialport npm install serialport 2)编写index.js 1 const SerialPort require(serialport); 2 var senddata [0x02];//串口索要发送的数据源 3 var port new SerialPort(COM3);//连接串口COM3 4 port.on(open, fun…...
微信小程序请求大模型监听数据块onChunkReceived方法把数据解析成json
自己写的真是案例,onChunkReceived监听到的数据块发现监听到的内容不只是一个块,有时候会是多块,所以自己加了一个循环解析的过程,不知道大家监听到的数据情况是否一致。 在网上翻阅大量资料有的说引入js文件,亲测无效…...
SQL Server STUFF 函数的用法及应用场景
在 SQL Server 中,STUFF 函数是一种强大的字符串处理工具,常用于删除指定位置的字符并插入新的字符。通过这个函数,开发者能够灵活地修改字符串,从而在数据处理、字符串拼接和格式化等方面大显身手。本文将深入探讨 STUFF 函数的语…...
Qt使用CipherSqlite插件访问加密的sqllite数据库
1.下载 git clone https://github.com/devbean/QtCipherSqlitePlugin.git 2.编译CipherSqlite插件 使用qt打开QtCipherSqlitePlugin项目,并构建插件 3.将构建的插件复制到安装目录 4.使用DB Browser (SQLCipher)创建数据库并加密 5.qt使用Ciphe…...
美国哈美顿零件号A203560 HAMILTON 10µl 1701 N CTC (22S/3) A200S 203560
零件号a61092-01 hamilton ml600 电源 110-220 vac 61092-01 零件号a81322 hamilton 1001 tll 1ml 注射器带塞子 81322 零件号a61710-01 hamilton ml600 探头支架 管架 61710-01 零件号a61614-01 hamilton ml600 填充管 12 ga 1219mm 4.57ml 61614-01 零件号a61615-01 ham…...
深入理解 Rust 的迭代器:从基础到高级
1. 迭代器的基础概念 1.1 什么是迭代器? 迭代器是一种设计模式,允许我们逐个访问集合中的元素,而无需暴露集合的内部结构。在 Rust 中,迭代器通过实现 Iterator trait 来定义。该 trait 主要包含一个方法: pub trai…...
聊聊 IP 地址和端口号的区别
在计算机网络中,两个基本概念对于理解设备如何通过网络进行通信至关重要。IP 地址和端口号是 TCP/IP 的典型特征,其定义如下:IP 地址是分配给连接到网络的每台机器的唯一地址,用于定位机器并与其通信。相反,端口号用于…...
地图打包注意事项
地图打包 (注意不能大写 后缀也不能) 需要文件 objects_n 文件夹 (内部大量png文件和plist文件).map.png 小地图tiles_n_n.plist 和tiles_n_n.png 文件sceneAtlasSplitConfigs合并.txt 文件放入 objects_n文件夹 内部(.png文件…...
代码随想录算法营Day38 | 62. 不同路径,63. 不同路径 II,343. 整数拆分,96. 不同的二叉搜索树
62. 不同路径 这题的限制是机器人在m x n的网格的左上角,每次只能向下走一格或者向右走一格。问到右下角有多少条不同路径。这个动态规划的初始状态是第一行和第一列的格子的值都是1,因为机器人只能向右走一格或者向下走一格,所以第一行和第…...
科普:数据仓库中的“指标”和“维度”
在数据仓库中,指标和维度是两个核心概念,它们对于数据分析和业务决策至关重要。以下是对这两个概念的分析及举例说明: 一、指标 定义: 指标是用于衡量业务绩效的关键数据点,通常用于监控、分析和优化企业的运营状况。…...
`Pinia` + `Formily` + `useTable` 实现搜索条件缓存方案
Pinia + Formily + useTable 实现搜索条件缓存方案 背景 在当前的应用体验中,每当用户刷新页面或退出系统时,之前的搜索条件就会消失不见。为了进一步提升工作效率并增强用户体验,希望能够实现这样一个功能:即使用户进行了页面刷新或是暂时离开了平台,再次返回时也能自动…...
Trader Joe‘s EDI 需求分析
Trader Joes成立于1967年,总部位于美国加利福尼亚州,是一家独特的零售商,专注于提供高质量且价格合理的食品。公司经营范围涵盖了各类杂货、冷冻食品、健康食品以及独特的本地特色商品。 EDI需求分析 电子数据交换(EDIÿ…...