【Java基础增强】类加载器和反射
1.类加载器
1.1类加载器【理解】
-
作用
负责将.class文件(存储的物理文件)加载在到内存中

1.2类加载的过程【理解】
-
类加载时机
-
创建类的实例(对象)
-
调用类的类方法
-
访问类或者接口的类变量,或者为该类变量赋值
-
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
-
初始化某个类的子类
-
直接使用java.exe命令来运行某个主类
-
-
类加载过程
-
加载
-
通过包名 + 类名,获取这个类,准备用流进行传输
-
在这个类加载到内存中
-
加载完毕创建一个class对象

-
-
链接
-
验证
确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
(文件中的信息是否符合虚拟机规范有没有安全隐患)

-
准备
负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值
(初始化静态变量)

-
解析
将类的二进制数据流中的符号引用替换为直接引用
(本类中如果用到了其他类,此时就需要找到对应的类)

-
-
初始化
根据程序员通过程序制定的主观计划去初始化类变量和其他资源
(静态变量赋值以及初始化其他资源)

-
-
小结
-
当一个类被使用的时候,才会加载到内存
-
类加载的过程: 加载、验证、准备、解析、初始化
-
1.3类加载的分类【理解】
-
分类
-
Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
-
Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
-
System class loader:系统类加载器,负责加载用户类路径上所指定的类库
-
-
类加载器的继承关系
-
System的父加载器为Platform
-
Platform的父加载器为Bootstrap
-
-
代码演示
public class ClassLoaderDemo1 {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//获取系统类加载器的父加载器 --- 平台类加载器ClassLoader classLoader1 = systemClassLoader.getParent();//获取平台类加载器的父加载器 --- 启动类加载器ClassLoader classLoader2 = classLoader1.getParent();System.out.println("系统类加载器" + systemClassLoader);System.out.println("平台类加载器" + classLoader1);System.out.println("启动类加载器" + classLoader2);} }
1.4双亲委派模型【理解】
-
介绍
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

1.5ClassLoader 中的两个方法【应用】
-
方法介绍
方法名 说明 public static ClassLoader getSystemClassLoader() 获取系统类加载器 public InputStream getResourceAsStream(String name) 加载某一个资源文件 -
示例代码
public class ClassLoaderDemo2 {public static void main(String[] args) throws IOException {//static ClassLoader getSystemClassLoader() 获取系统类加载器//InputStream getResourceAsStream(String name) 加载某一个资源文件//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件//参数:文件的路径(放在src的根目录下,默认去那里加载)//返回值:字节流。InputStream is = systemClassLoader.getResourceAsStream("prop.properties");Properties prop = new Properties();prop.load(is);System.out.println(prop);is.close();} }
2.反射
2.1反射的概述【理解】
-
反射机制
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意属性和方法; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
2.2获取Class类对象的三种方式【应用】
-
三种方式分类
-
类名.class属性
-
对象名.getClass()方法
-
Class.forName(全类名)方法

-
-
示例代码
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void study(){System.out.println("学生在学习");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} } public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//1.Class类中的静态方法forName("全类名")//全类名:包名 + 类名Class clazz = Class.forName("com.itheima.myreflect2.Student");System.out.println(clazz);//2.通过class属性来获取Class clazz2 = Student.class;System.out.println(clazz2);//3.利用对象的getClass方法来获取class对象//getClass方法是定义在Object类中.Student s = new Student();Class clazz3 = s.getClass();System.out.println(clazz3);System.out.println(clazz == clazz2);System.out.println(clazz2 == clazz3);} }
2.3反射获取构造方法并使用【应用】
2.3.1Class类获取构造方法对象的方法
-
方法介绍
方法名 说明 Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组 Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组 Constructor<T> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象 -
示例代码
public class Student {private String name;private int age;//私有的有参构造方法private Student(String name) {System.out.println("name的值为:" + name);System.out.println("private...Student...有参构造方法");}//公共的无参构造方法public Student() {System.out.println("public...Student...无参构造方法");}//公共的有参构造方法public Student(String name, int age) {System.out.println("name的值为:" + name + "age的值为:" + age);System.out.println("public...Student...有参构造方法");} } public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//method1();//method2();//method3();//method4();}private static void method4() throws ClassNotFoundException, NoSuchMethodException {// Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): // 返回单个构造方法对象//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor constructor = clazz.getDeclaredConstructor(String.class);System.out.println(constructor);}private static void method3() throws ClassNotFoundException, NoSuchMethodException {// Constructor<T> getConstructor(Class<?>... parameterTypes): // 返回单个公共构造方法对象//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");//小括号中,一定要跟构造方法的形参保持一致.Constructor constructor1 = clazz.getConstructor();System.out.println(constructor1);Constructor constructor2 = clazz.getConstructor(String.class, int.class);System.out.println(constructor2);//因为Student类中,没有只有一个int的构造,所以这里会报错.Constructor constructor3 = clazz.getConstructor(int.class);System.out.println(constructor3);}private static void method2() throws ClassNotFoundException {// Constructor<?>[] getDeclaredConstructors(): // 返回所有构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor[] constructors = clazz.getDeclaredConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}}private static void method1() throws ClassNotFoundException {// Constructor<?>[] getConstructors(): // 返回所有公共构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}} }
2.3.2Constructor类用于创建对象的方法
-
方法介绍
方法名 说明 T newInstance(Object...initargs) 根据指定的构造方法创建对象 setAccessible(boolean flag) 设置为true,表示取消访问检查 -
示例代码
public class Student {private String name;private int age;//私有的有参构造方法private Student(String name) {System.out.println("name的值为:" + name);System.out.println("private...Student...有参构造方法");}//公共的无参构造方法public Student() {System.out.println("public...Student...无参构造方法");}//公共的有参构造方法public Student(String name, int age) {System.out.println("name的值为:" + name + "age的值为:" + age);System.out.println("public...Student...有参构造方法");} } public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//method1();//method2();//method3();//method4();}private static void method4() throws ClassNotFoundException, NoSuchMethodException {// Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): // 返回单个构造方法对象//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor constructor = clazz.getDeclaredConstructor(String.class);System.out.println(constructor);}private static void method3() throws ClassNotFoundException, NoSuchMethodException {// Constructor<T> getConstructor(Class<?>... parameterTypes): // 返回单个公共构造方法对象//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");//小括号中,一定要跟构造方法的形参保持一致.Constructor constructor1 = clazz.getConstructor();System.out.println(constructor1);Constructor constructor2 = clazz.getConstructor(String.class, int.class);System.out.println(constructor2);//因为Student类中,没有只有一个int的构造,所以这里会报错.Constructor constructor3 = clazz.getConstructor(int.class);System.out.println(constructor3);}private static void method2() throws ClassNotFoundException {// Constructor<?>[] getDeclaredConstructors(): // 返回所有构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor[] constructors = clazz.getDeclaredConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}}private static void method1() throws ClassNotFoundException {// Constructor<?>[] getConstructors(): // 返回所有公共构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.itheima.myreflect3.Student");Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}} }
2.3.3小结
-
获取class对象
三种方式: Class.forName(“全类名”), 类名.class, 对象名.getClass()
-
获取里面的构造方法对象
getConstructor (Class<?>... parameterTypes) getDeclaredConstructor (Class<?>... parameterTypes)
-
如果是public的,直接创建对象
newInstance(Object... initargs)
-
如果是非public的,需要临时取消检查,然后再创建对象
setAccessible(boolean) 暴力反射
2.4反射获取成员变量并使用【应用】
2.4.1Class类获取成员变量对象的方法
-
方法分类
方法名 说明 Field[] getFields() 返回所有公共成员变量对象的数组 Field[] getDeclaredFields() 返回所有成员变量对象的数组 Field getField(String name) 返回单个公共成员变量对象 Field getDeclaredField(String name) 返回单个成员变量对象 -
示例代码
public class Student {public String name;public int age;public String gender;private int money = 300;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", money=" + money +'}';} } public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {// method1();//method2();//method3();//method4();}private static void method4() throws ClassNotFoundException, NoSuchFieldException {// Field getDeclaredField(String name):返回单个成员变量对象//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取money成员变量Field field = clazz.getDeclaredField("money");//3.打印一下System.out.println(field);}private static void method3() throws ClassNotFoundException, NoSuchFieldException {// Field getField(String name):返回单个公共成员变量对象//想要获取的成员变量必须是真实存在的//且必须是public修饰的.//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取name这个成员变量//Field field = clazz.getField("name");//Field field = clazz.getField("name1");Field field = clazz.getField("money");//3.打印一下System.out.println(field);}private static void method2() throws ClassNotFoundException {// Field[] getDeclaredFields():返回所有成员变量对象的数组//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取所有的Field对象Field[] fields = clazz.getDeclaredFields();//3.遍历for (Field field : fields) {System.out.println(field);}}private static void method1() throws ClassNotFoundException {// Field[] getFields():返回所有公共成员变量对象的数组//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取Field对象.Field[] fields = clazz.getFields();//3.遍历for (Field field : fields) {System.out.println(field);}} }
2.4.2Field类用于给成员变量赋值的方法
-
方法介绍
方法名 说明 void set(Object obj, Object value) 赋值 Object get(Object obj) 获取值 -
示例代码
// Student类同上一个示例,这里就不在重复提供了 public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { // Object get(Object obj) 返回由该 Field表示的字段在指定对象上的值。//method1();//method2();}private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取成员变量Field的对象Field field = clazz.getDeclaredField("money");//3.取消一下访问检查field.setAccessible(true);//4.调用get方法来获取值//4.1创建一个对象Student student = (Student) clazz.newInstance();//4.2获取指定对象的money的值Object o = field.get(student);//5.打印一下System.out.println(o);}private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {// void set(Object obj, Object value):给obj对象的成员变量赋值为value//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect4.Student");//2.获取name这个Field对象Field field = clazz.getField("name");//3.利用set方法进行赋值.//3.1先创建一个Student对象Student student = (Student) clazz.newInstance();//3.2有了对象才可以给指定对象进行赋值field.set(student,"zhangsan");System.out.println(student);} }
2.5反射获取成员方法并使用【应用】
2.5.1Class类获取成员方法对象的方法
-
方法分类
方法名 说明 Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的 Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承的 Method getMethod(String name, Class<?>... parameterTypes) 返回单个公共成员方法对象 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回单个成员方法对象 -
示例代码
public class Student {//私有的,无参无返回值private void show() {System.out.println("私有的show方法,无参无返回值");}//公共的,无参无返回值public void function1() {System.out.println("function1方法,无参无返回值");}//公共的,有参无返回值public void function2(String name) {System.out.println("function2方法,有参无返回值,参数为" + name);}//公共的,无参有返回值public String function3() {System.out.println("function3方法,无参有返回值");return "aaa";}//公共的,有参有返回值public String function4(String name) {System.out.println("function4方法,有参有返回值,参数为" + name);return "aaa";} } public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//method1();//method2();//method3();//method4();//method5();}private static void method5() throws ClassNotFoundException, NoSuchMethodException {// Method getDeclaredMethod(String name, Class<?>... parameterTypes): // 返回单个成员方法对象//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取一个成员方法showMethod method = clazz.getDeclaredMethod("show");//3.打印一下System.out.println(method);}private static void method4() throws ClassNotFoundException, NoSuchMethodException {//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取一个有形参的方法function2Method method = clazz.getMethod("function2", String.class);//3.打印一下System.out.println(method);}private static void method3() throws ClassNotFoundException, NoSuchMethodException {// Method getMethod(String name, Class<?>... parameterTypes) : // 返回单个公共成员方法对象//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取成员方法function1Method method1 = clazz.getMethod("function1");//3.打印一下System.out.println(method1);}private static void method2() throws ClassNotFoundException {// Method[] getDeclaredMethods(): // 返回所有成员方法对象的数组,不包括继承的//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取Method对象Method[] methods = clazz.getDeclaredMethods();//3.遍历一下数组for (Method method : methods) {System.out.println(method);}}private static void method1() throws ClassNotFoundException {// Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取成员方法对象Method[] methods = clazz.getMethods();//3.遍历for (Method method : methods) {System.out.println(method);}} }
2.5.2Method类用于执行方法的方法
-
方法介绍
方法名 说明 Object invoke(Object obj, Object... args) 运行方法 参数一: 用obj对象调用该方法
参数二: 调用方法的传递的参数(如果没有就不写)
返回值: 方法的返回值(如果没有就不写)
-
示例代码
public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException { // Object invoke(Object obj, Object... args):运行方法 // 参数一:用obj对象调用该方法 // 参数二:调用方法的传递的参数(如果没有就不写) // 返回值:方法的返回值(如果没有就不写)//1.获取class对象Class clazz = Class.forName("com.itheima.myreflect5.Student");//2.获取里面的Method对象 function4Method method = clazz.getMethod("function4", String.class);//3.运行function4方法就可以了//3.1创建一个Student对象,当做方法的调用者Student student = (Student) clazz.newInstance();//3.2运行方法Object result = method.invoke(student, "zhangsan");//4.打印一下返回值System.out.println(result);} }
相关文章:
【Java基础增强】类加载器和反射
1.类加载器 1.1类加载器【理解】 作用 负责将.class文件(存储的物理文件)加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例(对象) 调用类的类方法 访问类或者接口的类变量,或者为该类变量赋值 …...
【Java】数据类型变量
【Java】数据类型&变量 文章目录 【Java】数据类型&变量1、字面常量2、数据类型3、变量3.1 整型变量3.1.1 整型变量3.1.2 长短整型变量3.1.3 字节型变量 3.2 浮点型变量3.2.1 双精度浮点型3.2.2 单精度浮点型 3.3 字符型变量3.4 布尔型变量3.5 类型转换3.5.1 自动类型转…...
护目镜佩戴检测识别算法
护目镜佩戴检测识别算法通过opencvpython网络深度学习模型,护目镜佩戴检测识别算法实时监测工人的护目镜佩戴情况,发现未佩戴或错误佩戴的情况,及时提醒调整。与C / C等语言相比,Python速度较慢。也就是说,Python可以使…...
NOIOLPJ2022B. 数学游戏 分析
数学游戏 题目描述 Kri 喜欢玩数字游戏。 一天,他在草稿纸上写下了 ttt 对正整数 (x,y)(x,y)(x,y),并对于每一对正整数计算出了 zxygcd(x,y)z x \times y \times \gcd(x,y)zxygcd(x,y)。 可是调皮的 Zay 找到了 Kri 的草稿纸,并把每一组的…...
android studio gradle build running慢 卡住不动 失败 原因与解决方式
快速导航 分析原因解决办法 分析原因 主要原因是 gradle 构建时无法从网络获取需要的包或库。 解决办法 将国外库替换为阿里云镜像库。 例如 google 对应的库是 maven { url ‘https://maven.aliyun.com/repository/google’ }...
如何保障Facebook账号登录稳定
当谈到保障Facebook账号的稳定性时,我们不得不提到那些令人头疼的情况——Facebook账号被封。尽管我们已经踏入数字化的未来,但是被封号似乎是一个时常困扰着社交媒体用户的问题。那么,让我们来看看一些常见的Facebook账号被封的原因…...
当前目录下的excel文件的两列内容的相似度比较
# -- coding: utf-8 --** from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity import numpy as np import pandas as pd import os # 获取当前目录 current_dir os.getcwd() # 获取当前目录下所有xlsx文件…...
Cookie for Mac:隐私保护工具保护您的在线隐私
随着互联网的发展,我们每天都会浏览各种网站,享受在线购物、社交娱乐和学习资料等各种便利。然而,您是否曾经遇到过需要频繁输入用户名和密码的情况?或者不方便访问您常用的网站?如果是这样,那么Cookie for…...
Huggingface训练Transformer
在之前的博客中,我采用SFT(监督优化训练)的方法训练一个GPT2的模型,使得这个模型可以根据提示语进行回答。具体可见博客召唤神龙打造自己的ChatGPT_gzroy的博客-CSDN博客 Huggingface提供了一个TRL的扩展库,可以对tra…...
IA-YOLO项目中DIP模块的初级解读
IA-YOLO项目源自论文Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions,其提出端到端方式联合学习CNN-PP和YOLOv3,这确保了CNN-PP可以学习适当的DIP,以弱监督的方式增强图像检测。IA-YOLO方法可以自适应地处理正常和不…...
MathType7.4mac最新版本数学公式编辑器安装教程
MathType7.4中文版是一款功能强大且易于使用的公式编辑器。该软件可与word软件配合使用,有效提高了教学人员的工作效率,避免了一些数学符号和公式无法在word中输入的麻烦。新版MathType7.4启用了全新的LOGO,带来了更多对数学符号和公式的支持…...
为Claude的分析内容做准备:提取PDF页面内容的简易应用程序
由于Claude虽然可以分析整个文件,但是对文件的大小以及字数是有限制的,为了将pdf文件分批传入Claude人工智能分析和总结文章内容,才有了这篇博客: 在本篇博客中,我们将介绍一个基于 wxPython 和 PyMuPDF 库编写的简易的…...
js中作用域的理解?
1.作用域 作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说,作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "函数内部变量"; } myFunction();//要先执行这…...
机器学习基础之《分类算法(4)—案例:预测facebook签到位置》
一、背景 1、说明 2、数据集 row_id:签到行为的编码 x y:坐标系,人所在的位置 accuracy:定位的准确率 time:时间戳 place_id:预测用户将要签到的位置 3、数据集下载 https://www.kaggle.com/navoshta/gr…...
【Java】反射 之 调用方法
调用方法 我们已经能通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method: Method getMethod(name, Class...):获取某个public的Method(包括父类&a…...
Java——单例设计模式
什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱、“套路”。 经典的设计模式共有23种。…...
Java实现excel表数据的批量存储(结合easyexcel插件)
场景:加哥最近在做项目时,苦于系统自身并未提供数据批量导入的功能还不能自行添加上该功能,且自身不想手动一条一条将数据录入系统。随后,自己使用JDBC连接数据库、使用EasyExcel插件读取表格并将数据按照业务逻辑批量插入数据库完…...
Config:客户端连接服务器访问远程
springcloud-config: springcloud-config push pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…...
【KMP算法-代码随想录】
目录 1.什么是KMP2.什么是next数组3.什么是前缀表(1)前后缀含义(2)最长公共前后缀(3)前缀表的必要性 4.计算前缀表5.前缀表与next数组(1)使用next数组来匹配 6.构造next数组…...
【手写promise——基本功能、链式调用、promise.all、promise.race】
文章目录 前言一、前置知识二、实现基本功能二、实现链式调用三、实现Promise.all四、实现Promise.race总结 前言 关于动机,无论是在工作还是面试中,都会遇到Promise的相关使用和原理,手写Promise也有助于学习设计模式以及代码设计。 本文主…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
