进阶篇-Day17:JAVA的日志、枚举、类加载器、反射等介绍】
目录
- 1、日志
- 1.1 日志概念
- 1.2 日志框架
- (1) Logback框架:
- (2)配置文件介绍:
- 2、枚举
- 3、类加载器
- 3.1 类加载器的介绍
- 3.2 类加载器的加载过程:加载、链接、初始化
- 3.3 类加载器的分类
- 3.4 双亲委派模式
- 3.4 ClassLoaser的常用成员方法
- 4、反射
- 4.1 反射概念
- 4.2 反射的使用
- 4.2.1 获取类的字节码对象:
- 4.2.2 反射类中的构造方法
- 4.2.3 反射类中的成员变量
- 4.2.4 反射类中的成员方法
- 4.2.5 案例:
- (1)
- (2)
1、日志
1.1 日志概念
前面我们其实已经在记录日志,如下所示,通过将信息打印到控制台来查看程序运行到哪里了。
接下来学习日志框架来记录日志。
1.2 日志框架
(1) Logback框架:
1、引入三个jar包:
这里有教程下载:https://www.cnblogs.com/yumengqifei/p/16407919.html
2、导入配置文件
3、获取日志对象使用:
package com.itheima.log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LogTest {public static void main(String[] args) {//获取日志对象Logger logger = LoggerFactory.getLogger("LogTest.class");logger.info("记录了一条日志");}
}
运行结果:
(2)配置文件介绍:
下面是logback.xml的样例(可复制后自己改),以及说明:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!-- 控制台应用器:表示当前的日志信息是可以输出到控制台的 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!-- 输出流对象,默认System.out,也可使用System.err --><!-- 输出流对象,默认System.out,也可使用System.err --><target>System.err</target><!-- 格式化输出:%d:表示日期%thread:表示线程名%-5level:表示级别从左显示5个字符宽度%c:表示获取日志时传入的字符串%msg:表示日志消息%n:是换行符--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread]: %msg%n</pattern></encoder></appender><!-- 文件应用器:输出的方向通向文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志输出路径 --><file>logs/myapp.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern><charset>utf-8</charset></encoder><!-- 指定日志文件拆分和压缩规则 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 通过指定压缩文件名称,来确定分割文件方式 --><fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 文件拆分大小 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy></appender><!--日志级别:level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF。默认debug<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。--><root level="all"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root></configuration>
2、枚举
直接看一个例子:
package com.itheima.my_enum;public class Enum_Test {/*** 枚举介绍:Java中一种特殊的类型,常用于信息的标记和分类,和常量相比,有如下特点:* 1、常量* 2、枚举:入参严谨、提示性更强、代码优雅*/public static void main(String[] args) {method(Season.SUMMER);//注意:入参是枚举类Season的对象System.out.println(Season.SPRING.getCode());//1System.out.println(Season.SPRING.getName());//春天System.out.println(Season.SPRING.getDesc());//我是春天}private static void method(Season season) {switch (season){case SPRING:System.out.println("春天");break;case SUMMER:System.out.println("夏天");break;case AUTUMN:System.out.println("秋天");break;case WINTER:System.out.println("冬天");break;}}
}enum Season{//枚举项:枚举类的对象SPRING("1", "春天", "我是春天"),SUMMER("2", "夏天", "我是夏天"),AUTUMN("3", "秋天", "我是秋天"),WINTER("4", "冬天", "我是冬天");private final String code;private final String name;private final String desc;//枚举类的带参构造方法,则枚举类的对象入参必须要写private Season(String code, String name, String desc){this.code = code;this.name = name;this.desc = desc;}public String getCode() {return code;}public String getName() {return name;}public String getDesc() {return desc;}
}
3、类加载器
3.1 类加载器的介绍
3.2 类加载器的加载过程:加载、链接、初始化
上述的解析需要解释一下,如果一个类只是被加载到方法区,那么这个类里的其他类只是一个符号,并没有创建地址,只有当这个类被创建了之后,这个类里的其他类才会分配地址,也就是上述说的:将常量池中的符号引用解析为直接引用。
3.3 类加载器的分类
package com.itheima.classloader;
import sun.net.spi.nameservice.dns.DNSNameService;
public class ClassLoaderTest {/*** 各自类加载器的职责*/public static void main(String[] args) {//1、加载JDK自带的类 BootStrap ClassLoader (启动类加载器)ClassLoader classLoader1 = String.class.getClassLoader();System.out.println(classLoader1);//2、Platform ClassLoader (平台类加载器) jdk8的话,获取的是jre\lib\ext\ jdk9及之后的话 lib\modulesClassLoader classLoader2 = DNSNameService.class.getClassLoader();System.out.println(classLoader2);//3、Application ClassLoader (系统类加载器) 加载自己编写的类ClassLoader classLoader3 = ClassLoaderTest.class.getClassLoader();System.out.println(classLoader3);//sun.misc.Launcher$AppClassLoader@18b4aac2//4、测试类加载器的上下级关系System.out.println(classLoader3.getParent());//获取他的上级System.out.println(classLoader3.getParent().getParent());//获取他上级的上级}
}
3.4 双亲委派模式
3.4 ClassLoaser的常用成员方法
package com.itheima.classloader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class ClassLoaderMethod {public static void main(String[] args) throws IOException {//获取系统类加载器 Application Class LoaderClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);//通过系统类加载器,加载配置文件//系统类加载器加载我们自己编写的类,因为自己编写的类在src文件夹下,因此下面的路径写相对路径即可InputStream is = systemClassLoader.getResourceAsStream("config1.properties");//FileReader fileReader = new FileReader("config1.properties");//之前我们通过字符流加载配置文件Properties prop = new Properties();prop.load(is);//prop.load(fileReader);is.close();String username = prop.getProperty("username");String password = prop.getProperty("password");System.out.println(username);System.out.println(password);}
}
4、反射
4.1 反射概念
正常java程序运行时,先将
.java
文件编译成.class
的字节码文件后,将需要用到的字节码文件加载到方法区进行调用。而反射机制实际上就是直接拿到.class
的字节码文件后作解剖,即直接操作字节码文件对应的对象(即字节码对象,注:java中万物皆对象)。
4.2 反射的使用
4.2.1 获取类的字节码对象:
package com.itheima.reflect;
import com.itheima.domain.Student;public class ReflectDemo1 {/*** 获取字节码对象的三种方式*/public static void main(String[] args) throws ClassNotFoundException {//1、通过Class的静态方法forNameClass<?> class1 = Class.forName("com.itheima.domain.Student");//2、类名.classClass<Student> class2 = Student.class;//3、Object类中的getClass()Student stu = new Student();Class<? extends Student> class3 = stu.getClass();System.out.println(class1);System.out.println(class2);System.out.println(class3);//字节码文件只有一份,那这三种方法获取到的字节码对象应该也是指向同一个地址,我们看下是否是这样:返回为true,表明正确System.out.println(class1 == class2);//trueSystem.out.println(class2 == class3);//trueSystem.out.println(class3 == class1);//true}
}
4.2.2 反射类中的构造方法
package com.itheima.reflect;
import java.lang.reflect.Constructor;public class ReflectDemo2 {/*** 反射类中的构造方法** 1. Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组* 2. Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组* 3. Constructor<?>[] getConstructor(Class<?>...parameterTypes) 返回单个公共构造方法对象,参数是字节码对象,用来识别返回哪个构造方法* 4. Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes) 返回单个构造方法对象,参数是字节码对象,识别返回哪个构造方法** --------------------------------------------------------------------------------------------------------* 创建对象的方法* 1.T newInstance(Object...initargs) 根据指定的构造方法创建对象* 2.setAccessible(boolean flag) 设置为true,表示取消访问检查*/public static void main(String[] args) throws Exception {//1、获取类的字节码对象Class<?> studentClass = Class.forName("com.itheima.domain.Student");//2、反射构造方法对象
// Constructor<?>[] constructors = studentClass.getConstructors();//返回所有公共构造方法对象的数组Constructor<?>[] constructors = studentClass.getDeclaredConstructors();//返回所有构造方法对象的数组for (Constructor<?> constructor : constructors) {System.out.println(constructor);}//3、反射单个构造方法
// Constructor<?> constructor = studentClass.getConstructor();//返回单个公共构造方法对象Constructor<?> constructor = studentClass.getDeclaredConstructor(String.class, int.class);//返回带参构造方法对象constructor.setAccessible(true);//设置为true,表示取消访问检查。即:私有构造方法也可以有权限使用System.out.println(constructor);//4、通过构造方法对象,完成实例化Object o = constructor.newInstance("小明", 67);System.out.println(o);}
}
4.2.3 反射类中的成员变量
package com.itheima.reflect;
import com.itheima.domain.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;public class ReflectDemo3 {/*** 反射类中的成员变量* 1.Field[] getFields() 返回所有公共成员变量对象的数组* 2.Field[] getDeclaredFields() 返回所有成员变量对象的数组* 3.Field getFields(String name) 返回单个公共成员变量对象* 4.Field getDeclaredFields(String name) 返回单个成员变量对象--------------------------------------------------------------------* Field类的设置和获取方法* 1.void set(Object obj, Object value) 赋值* 2.Object get(Object obj) 获取值*/public static void main(String[] args) throws Exception {//1、获取类的字节码对象Class<Student> studentClass = Student.class;//2、反射内部的成员变量对象Field[] declaredFields = studentClass.getDeclaredFields();//暴力返回所有的成员变量(私有共有都返回)Field[] fields = studentClass.getFields();//返回所有的公共成员变量for (Field declaredField : declaredFields) {System.out.println(declaredField);}Field ageField = studentClass.getDeclaredField("age");Field nameField = studentClass.getDeclaredField("name");//3、设置访问权限ageField.setAccessible(true);nameField.setAccessible(true);//4、使用成员变量,完成赋值和获取操作Constructor<Student> constructor = studentClass.getConstructor();//获取反射类的构造方法Student student = constructor.newInstance();//用反射类的构造方法new一个对象ageField.set(student, 34);nameField.set(student, "马斯");System.out.println(ageField.get(student));System.out.println(nameField.get(student));}
}
4.2.4 反射类中的成员方法
package com.itheima.reflect;
import com.itheima.domain.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class ReflectDemo4 {/*** 反射类中的成员方法* 1.Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的* 2.Method[] getDeclaredMethods() 返回所有公成员方法对象的数组,不包括继承的* 3.Method getMethod(String name, Class<?>...parameterTypes) 返回单个* 4.Method getDeclaredMethod(String name, Class<?>...parameterTypes) 返回单个* ----------------------------------------------------------------------------* Method类的执行方法* Object invoke(Object obj, Object... args) 运行方法*/public static void main(String[] args) throws Exception{//1、获取字节码对象Class<Student> studentClass = Student.class;//2、通过字节码对象,反射内部的成员方法对象(所有public修饰的)Method[] methods = studentClass.getMethods();//返回所有公共成员方法对象的数组,包括继承的Method[] declaredMethods = studentClass.getDeclaredMethods();//返回所有公成员方法对象的数组,不包括继承的for (Method method : declaredMethods) {System.out.println(method);}//3、通过字节码对象,反射指定的成员方法Method method1 = studentClass.getMethod("eat");//eat为方法名,空参eat()方法Method method2 = studentClass.getMethod("eat", int.class);//eat为方法名,带参数的eat(int num)方法System.out.println(method1);System.out.println(method2);//4、让反射到的成员方法执行Constructor<Student> constructor = studentClass.getConstructor();//用反射类的构造方法创建对象Student student = constructor.newInstance();method2.invoke(student, 2);//第一个参数为对象,第二个参数为方法的参数}
}
4.2.5 案例:
(1)
package com.itheima.reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;public class ReflectTest1 {/*** 需求:请向一个泛型为 Integer 的集合,添加一个 String 字符串* 思路:Java 中的泛型是假的,只在编译的时候有效。也就是说,字节码文件里没有泛型*/public static void main(String[] args) throws Exception {ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList, 1, 2, 3, 4);//1、获取list集合对象的字节码对象Class<? extends ArrayList> listClass = arrayList.getClass();//2、反射类中的add成员方法Method addMethod = listClass.getMethod("add", Object.class);//3、调用add方法,添加字符串。注:因为字节码文件没有泛型,因此我们可以向之前定义泛型为int的集合添加字符串addMethod.invoke(arrayList, "哈哈");System.out.println(arrayList);//[1, 2, 3, 4, 哈哈]}
}
(2)
public class Student {private String name;private int age;public void eat(){System.out.println("学生吃饭...");}public void study(){System.out.println("学生学习...");}
}
public class Teacher {private String name;private int age;public void eat(){System.out.println("老师吃饭...");}public void teach(){System.out.println("老师教学...");}
}
public class Worker {private String name;private int age;public void sleep(){System.out.println("工人睡觉...");}public void work(){System.out.println("工人工作...");}
}
config.properties文件:
className=com.itheima.reflect.Worker
methodName=sleep
package com.itheima.reflect;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;public class Test {/*** 从配置文件读取类名和方法名,然后获取字节码对象后,反射其方法并调用*/public static void main(String[] args) throws Exception{//1、加载配置文件InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("testConfig.properties");//2、创建properties集合加载数据Properties prop = new Properties();prop.load(is);is.close();//3、取出数据String className = prop.getProperty("className");String methodName = prop.getProperty("methodName");//4、获取字节码对象Class<?> aClass = Class.forName(className);//5、用字节码对象反射构造方法并创建对象Object instance = aClass.getConstructor().newInstance();//6、反射成员方法并调用Method eat = aClass.getMethod(methodName);eat.invoke(instance);}
}
相关文章:

进阶篇-Day17:JAVA的日志、枚举、类加载器、反射等介绍】
目录 1、日志1.1 日志概念1.2 日志框架(1) Logback框架:(2)配置文件介绍: 2、枚举3、类加载器3.1 类加载器的介绍3.2 类加载器的加载过程:加载、链接、初始化3.3 类加载器的分类3.4 双亲委派模式…...

Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解
文章目录 模式介绍优缺点适用场景模式结构案例实现 模式介绍 责任链模式又名职责链模式,它是一种对象行为的设计模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&…...
C++和Python中负数取余结果的区别
C中的负数取余规则(取模%)规则 在C中,取余运算( % )的结果符号与被除数相同。从数学定义角度看,C遵循的是尽量让商向零取整的规则。例如计算 -7/3,商是 -2 (向零取整)&a…...

rust学习——环境搭建
rust安装:https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html 1、vscode装插件: toml语法支持 依赖管理 rust语法支持 2、创建demo 3、查看目录 4、执行文件的几种方式: rust安装:https://www.rust-lang.org/z…...

Linux系统中解决端口占用问题
在日常的 Linux 系统管理和开发过程中,端口占用是一个常见且令人头疼的问题。无论是部署新服务、调试应用程序,还是进行系统维护,遇到端口被占用都可能导致服务无法正常启动或运行。本文将详细介绍在 Linux 系统中如何识别和解决端口占用问题…...
现代软件架构设计:14个质量属性的定义、权衡与最佳实践
1. 引言 1.1 技术架构的重要性 技术架构是指导软件系统设计和开发的核心,它定义了系统的高层结构及关键技术选型。一个优秀的技术架构可以提高开发效率、系统稳定性和扩展能力,确保项目成功落地。面对复杂业务场景,技术架构的设计至关重要&…...

【UE5 C++课程系列笔记】25——多线程基础——FGraphEventRef的简单使用
目录 概念 使用示例1 使用示例2 概念 FGraphEventRef 本质上是对一个异步任务或者一组相关异步任务在虚幻引擎任务图系统中的一种引用(reference)。虚幻引擎的任务图系统用于高效地调度和管理各种异步任务,协调它们的执行顺序以及处理任务…...
计算机网络之---信号与编码
信号 在物理层,信号是用来传输比特流的物理量,它可以是电压、电流、光强度等形式,通常通过电缆、光纤或者无线信道等媒介传播。 信号主要分为以下两种类型: 模拟信号(Analog Signal):信号在时间…...
linux下用命令行给串口写数据和读数据
在 Linux 系统中,串口设备(如 /dev/ttyS3)可以通过命令行进行读写操作。您遇到的问题是因为 Bash 解释了命令行中的字符串 “dis vlan\n”,但并没有按预期向串口设备发送数据。你应该将数据通过重定向发送到串口设备。 下面是如何…...
【生物信息】如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组
data_mat h5py.File(args.data_file) x1 np.array(data_mat[X1]) x2 np.array(data_mat[X2]) if not args.no_labels: y np.array(data_mat[Y]) data_mat.close() 这段代码展示了如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组。以下是代码的详细解释&a…...

纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)
1 引言 最近读一些Java Web开发类的书籍时,发现书中的连接数据库的过程缺少了一些关键性的过程,这对初学者非常不友好。为此,本文将给出详细的连接MySQL数据库的过程,并且是纯手工,不依赖于pom.xml和Web容器ÿ…...

thingsboard通过mqtt设备连接及数据交互---记录一次问题--1883端口没开,到服务器控制面板中打开安全组1883端口
1,链接不上:原因是1883端口没开,到服务器控制面板中打开安全组1883端口 2,参考链接: https://blog.csdn.net/bujingyun8/article/details/120024788...
联邦学习中的LoRA:FedLoRA
联邦学习中的LoRA:FedLoRA 联邦学习中的LoRA(Low-Rank Adaptation of Large Language Models)是一种用于在联邦学习场景下对大型语言模型进行低秩适应和高效微调的方法。以下是其原理及示例说明: 原理 低秩矩阵分解:在联邦学习中,通常会涉及到对预训练的大型模型进行微…...
PyTorch reshape函数介绍
torch.reshape 是 PyTorch 用于改变张量形状的函数之一。它不会改变张量的数据,而是重新组织其元素以适应新的形状。 reshape 的使用 torch.reshape(input, shape) → Tensorinput:输入张量。shape:新形状,使用整数或 -1 指定各维…...
Linux内核 -- 邮箱子系统之`mbox_controller` 的 `txdone_irq` 用法
Linux Kernel 中 mbox_controller 的 txdone_irq 用法 1. txdone_irq 的作用 txdone_irq 是一个布尔类型字段,用来指示邮件框控制器是否支持通过中断通知传输完成事件。 如果设置为 true: 硬件会在数据传输完成后生成中断。内核中相应的中断处理程序会…...

Linux/Ubuntu/银河麒麟 arm64 飞腾FT2000 下使用 arm64版本 linuxdeployqt 打包Qt程序
文章目录 一、前言二、环境三、准备1、下载Linuxdeployqt源码2、下载Appimagetool-aarch64.AppImage四、编译linuxdeployqt1.配置环境变量2.编译linuxdeployqt五、安装patchelf六、配置Appimagetool七、打包Qt程序重要提示:测试启动应用八、其他九、最后一、前言 因为项目需要…...

Excel | 空格分隔的行怎么导入excel?
准备工作:windows,一个记事本程序和微软的Excel软件。 打开记事本,选中所有内容,按CtrlA全选,然后复制(CtrlC)。 在Excel中,定位到你想粘贴的单元格,按CtrlV进行粘贴。粘贴后,你会在…...
如何将某两个提交去掉父提交的合并
q: 在一个两个月前的分支,我想保持纯净,但是需要把另一个变化很大的分支只将某两个提交的变更同步过来,基于idea的git操作该怎么做 a: 其实很多人会一下想到cherry pick,这个确实方便,但是会将父提交连带合…...
Windows下安装最新版的OpenSSL,并解决OpenSSL不是当前版本的问题,或者安装不正确的问题
文章目录 1. 文章引言1.1 需求描述1.2 简单介绍1.3 支持平台1.4 源码地址1.5 组件介绍2. 下载OpenSSL3. 安装OpenSSL5. 查看安装目录6. 解决OpenSSL的错误1. 文章引言 1.1 需求描述 今天接到一需求,解密php加密后的数据,由于php使用 openssl_encrypt的方式加密,java也需要使…...
Django 社团管理系统的设计与实现
标题:Django 社团管理系统的设计与实现 内容:1.摘要 本文介绍了 Django 社团管理系统的设计与实现。通过分析社团管理的需求,设计了系统的架构和功能模块,并使用 Django 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...