进阶篇-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 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...






