1.JavaWebJava基础加强[万字长文]-Junit、反射、注解核心知识点梳理

导语:

一、Junit单元测试

1.Junit测试概述

2.Junit使用步骤

3.Junit_@Before&@After

二、反射

1.反射概述

2.反射获取字节码Class对象的三种方式

3.Class对象功能概述

4.Class对象功能_获取Field

5.Class对象功能_获取Constructor

6.Class对象功能_获取Method

7.反射案例

三、注解

1.注解概念

2.JDK内置注解

3.自定义注解_格式&本质

4.自定义注解_属性定义

5.自定义注解_元注解

6.解析注解

7.注解案例_简单的测试框架

结语:


导语:

    这篇文档详细介绍了Java编程中Junit测试、反射原理和注解应用的核心知识点,旨在帮助初学者掌握Java基础,也可作为进阶学习的参考资料。

一、Junit单元测试

1.Junit测试概述

  • 黑盒测试:无需编写代码,只需给输入值,检查输出是否符合预期。

  • 白盒测试:需要编写代码,关注程序的具体执行流程。

案例代码:
    展示了如何使用JUnit进行黑盒测试和白盒测试:


public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {
    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    // 黑盒测试
    @Test
    public void testAdd() {
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }

    // 白盒测试
    @Test
    public void testSubtract() {
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
    }
}

2.Junit使用步骤

  • 定义测试类(以Test结尾)

  • 定义测试方法(以test开头)

  • 给测试方法添加@Test注解

  • 导入Junit依赖

案例代码:


import org.junit.Assert;
import org.junit.Test;

public class CalculatorTest {

    @Test
    public void testAdd() {
        Calculator c = new Calculator();
        int result = c.add(1, 2);
        Assert.assertEquals(3, result);
    }

    @Test
    public void testSubtract() {
        Calculator c = new Calculator();
        int result = c.subtract(5, 3);
        Assert.assertEquals(2, result);
    }
}

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

3.Junit_@Before&@After

  • @Before:初始化方法,在测试方法执行前自动执行

  • @After:释放资源方法,在测试方法执行后自动执行

代码案例:


import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {

    private Calculator calculator;

    @Before
    public void setUp() {
        // 初始化操作
        calculator = new Calculator();
        System.out.println("setUp...");
    }

    @After
    public void tearDown() {
        // 释放资源
        calculator = null;
        System.out.println("tearDown...");
    }

    @Test
    public void testAdd() {
        int result = calculator.add(1, 2);
        Assert.assertEquals(3, result);
    }

    @Test
    public void testSubtract() {
        int result = calculator.subtract(5, 3);
        Assert.assertEquals(2, result);
    }
}

二、反射

1.反射概述

  • 将类的各个组成部分封装为其他对象

  • 好处:在运行时操作对象,提高程序扩展性

代码案例:


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取类的Class对象
            Class<?> personClass = Class.forName("Person");

            // 获取所有public字段
            Field[] fields = personClass.getFields();
            for (Field field : fields) {
                System.out.println("Public field: " + field);
            }

            // 获取所有public方法
            Method[] methods = personClass.getMethods();
            for (Method method : methods) {
                System.out.println("Public method: " + method);
            }

            // 获取所有public构造器
            Constructor<?>[] constructors = personClass.getConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println("Public constructor: " + constructor);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

2.反射获取字节码Class对象的三种方式

  • Class.forName()

  • 类名.class

  • 对象.getClass()

代码案例:

public class ReflectionExample {

    public static void main(String[] args) {
        // 方式1:使用Class.forName()
        try {
            Class<?> personClass1 = Class.forName("Person");
            System.out.println(personClass1);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 方式2:使用类名.class
        Class<?> personClass2 = Person.class;
        System.out.println(personClass2);

        // 方式3:使用对象.getClass()
        Person person = new Person();
        Class<?> personClass3 = person.getClass();
        System.out.println(personClass3);
    }
}

3.Class对象功能概述

  • 获取成员变量

  • 获取构造方法

  • 获取成员方法

  • 获取全类名

案例代码:

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName("Person");

            // 获取所有成员变量
            Field[] fields = personClass.getDeclaredFields();
            for (Field field : fields) {
                System.out.println("Field: " + field);
            }

            // 获取所有构造方法
            Constructor<?>[] constructors = personClass.getDeclaredConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println("Constructor: " + constructor);
            }

            // 获取所有成员方法
            Method[] methods = personClass.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println("Method: " + method);
            }

            // 获取全类名
            String className = personClass.getName();
            System.out.println("Full class name: " + className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.Class对象功能_获取Field

  • Field[] getFields()

  • Field getField(String name)

  • Field[] getDeclaredFields()

  • Field getDeclaredField(String name)

案例代码:

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName("Person");

            // 获取所有public字段
            Field[] publicFields = personClass.getFields();
            for (Field field : publicFields) {
                System.out.println("Public Field: " + field);
            }

            // 获取指定名称的public字段
            Field publicField = personClass.getField("name");
            System.out.println("Specific Public Field: " + publicField);

            // 获取所有字段(包括private)
            Field[] allFields = personClass.getDeclaredFields();
            for (Field field : allFields) {
                System.out.println("Field: " + field);
            }

            // 获取指定名称的字段(包括private)
            Field privateField = personClass.getDeclaredField("age");
            System.out.println("Specific Field: " + privateField);
        } catch (ClassNotFoundException | NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

5.Class对象功能_获取Constructor

  • Constructor[] getConstructors()

  • Constructor getConstructor(参数类型…)

  • Constructor getDeclaredConstructor(参数类型…)

  • Constructor[] getDeclaredConstructors()

案例代码:

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName("Person");

            // 获取所有public构造器
            Constructor<?>[] publicConstructors = personClass.getConstructors();
            for (Constructor<?> constructor : publicConstructors) {
                System.out.println("Public Constructor: " + constructor);
            }

            // 获取指定参数的public构造器
            Constructor<?> publicConstructor = personClass.getConstructor(String.class);
            System.out.println("Specific Public Constructor: " + publicConstructor);

            // 获取所有构造器(包括private)
            Constructor<?>[] allConstructors = personClass.getDeclaredConstructors();
            for (Constructor<?> constructor : allConstructors) {
                System.out.println("Constructor: " + constructor);
            }

            // 获取指定参数的构造器(包括private)
            Constructor<?> privateConstructor = personClass.getDeclaredConstructor(String.class, int.class);
            System.out.println("Specific Constructor: " + privateConstructor);
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

6.Class对象功能_获取Method

  • Method[] getMethods()

  • Method getMethod(String name, 参数类型…)

  • Method[] getDeclaredMethods()

  • Method getDeclaredMethod(String name, 参数类型…)

案例代码:

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName("Person");

            // 获取所有public方法
            Method[] publicMethods = personClass.getMethods();
            for (Method method : publicMethods) {
                System.out.println("Public Method: " + method);
            }

            // 获取指定名称和参数的public方法
            Method publicMethod = personClass.getMethod("setName", String.class);
            System.out.println("Specific Public Method: " + publicMethod);

            // 获取所有方法(包括private)
            Method[] allMethods = personClass.getDeclaredMethods();
            for (Method method : allMethods) {
                System.out.println("Method: " + method);
            }

            // 获取指定名称和参数的方法(包括private)
            Method privateMethod = personClass.getDeclaredMethod("showAge");
            System.out.println("Specific Method: " + privateMethod);
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

7.反射案例

  • 从配置文件读取类名和方法名

  • 使用反射加载类、创建对象、执行方法

案例代码:

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 加载配置文件
            Properties properties = new Properties();
            InputStream inputStream = ReflectionExample.class.getClassLoader().getResourceAsStream("config.properties");
            properties.load(inputStream);

            // 读取配置文件中的类名和方法名
            String className = properties.getProperty("class.name");
            String methodName = properties.getProperty("method.name");

            // 使用反射加载类
            Class<?> classObj = Class.forName(className);

            // 使用反射创建对象
            Object obj = classObj.newInstance();

            // 使用反射执行方法
            Method method = classObj.getMethod(methodName);
            method.invoke(obj);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、注解

1.注解概念

  • 说明程序,给计算机看的

  • 分类:文档、代码分析、编译检查

案例代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 文档注解
@Deprecated
public class AnnotationExample {

    // 编译检查注解
    @Override
    public String toString() {
        return "This is a overridden toString method";
    }

    // 代码分析注解
    @SuppressWarnings("unchecked")
    public void analyzeCode() {
        // 这里会有类型转换的警告
        Object obj = new Object();
        String str = (String) obj;
    }

    // 自定义注解
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {
        String value() default "";
    }

    @MyAnnotation("Hello")
    public void annotatedMethod() {
        System.out.println("Annotated method");
    }
}

2.JDK内置注解

  • @Override

  • @Deprecated

  • @SuppressWarnings

案例代码:


public class AnnotationExample {

    // 使用@Override注解标记重写父类方法
    @Override
    public String toString() {
        return "This is a overridden toString method";
    }

    // 使用@Deprecated注解标记已过时的方法
    @Deprecated
    public void oldMethod() {
        System.out.println("This is an old method");
    }

    // 使用@SuppressWarnings注解压制编译器警告
    @SuppressWarnings("unchecked")
    public void analyzeCode() {
        // 这里会有类型转换的警告
        Object obj = new Object();
        String str = (String) obj;
    }
}

3.自定义注解_格式&本质

  • 本质是接口,默认继承Annotation接口

案例代码:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个自定义注解
@Target(ElementType.METHOD) // 注解的作用目标
@Retention(RetentionPolicy.RUNTIME) // 注解的保留策略
public @interface MyAnnotation {
    // 定义一个value属性
    String value();
}

// 使用自定义注解
public class AnnotationExample {

    // 在方法上使用自定义注解,并指定value属性值
    @MyAnnotation(value = "Hello")
    public void annotatedMethod() {
        System.out.println("Annotated method");
    }
}

4.自定义注解_属性定义

  • 返回值类型:基本数据类型、String、枚举、注解、数组

  • 属性赋值

案例代码:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个自定义注解
@Target(ElementType.METHOD) // 注解的作用目标
@Retention(RetentionPolicy.RUNTIME) // 注解的保留策略
public @interface MyAnnotation {
    // 定义一个String类型的value属性,并指定默认值为"Hello"
    String value() default "Hello";
    
    // 定义一个int类型的age属性
    int age();
    
    // 定义一个枚举类型的gender属性
    Gender gender();
    
    // 定义一个注解类型的anno属性
    MyAnnotation2 anno();
    
    // 定义一个String数组类型的tags属性
    String[] tags();
}

// 定义一个枚举类型
enum Gender {
    MALE, FEMALE
}

// 定义一个自定义注解
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2 {
    String value();
}

// 使用自定义注解
public class AnnotationExample {

    // 在方法上使用自定义注解,并为所有属性赋值
    @MyAnnotation(value = "World", age = 30, gender = Gender.MALE, anno = @MyAnnotation2("anno2"), tags = {"tag1", "tag2"})
    public void annotatedMethod() {
        System.out.println("Annotated method");
    }
}

5.自定义注解_元注解

  • @Target

  • @Retention

  • @Documented

  • @Inherited

案例代码:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个自定义注解
@Target(ElementType.METHOD) // 指定该注解只能用于方法
@Retention(RetentionPolicy.RUNTIME) // 指定注解保留到运行时
@Documented // 指定该注解会被包含在javadoc中
@Inherited // 指定该注解可以被继承
public @interface MyAnnotation {
    // 定义一个String类型的value属性,并指定默认值为"Hello"
    String value() default "Hello";
}

// 使用自定义注解
public class AnnotationExample {

    // 在方法上使用自定义注解
    @MyAnnotation("World")
    public void annotatedMethod() {
        System.out.println("Annotated method");
    }
}

// 继承了父类的注解
public class ChildClass extends AnnotationExample {
    // 子类会继承父类的@MyAnnotation注解
    @Override
    public void annotatedMethod() {
        System.out.println("Child class");
    }
}

6.解析注解

  • 获取注解定义位置的对象

  • 获取指定的注解

  • 调用注解方法获取属性值

案例代码:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 定义一个String类型的value属性
    String value();
}

// 使用自定义注解
public class AnnotationExample {

    // 在方法上使用自定义注解,并指定value属性值
    @MyAnnotation(value = "Hello")
    public void annotatedMethod() {
        System.out.println("Annotated method");
    }
}

// 解析注解
public class AnnotationParser {

    public static void main(String[] args) throws Exception {
        // 获取方法对象
        Method method = AnnotationExample.class.getMethod("annotatedMethod");

        // 获取方法上的MyAnnotation注解
        MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);

        // 调用注解方法获取value属性值
        String value = myAnnotation.value();

        // 输出value属性值
        System.out.println("Value: " + value);
    }
}

7.注解案例_简单的测试框架

  • 自定义注解

  • 定义测试类

  • 执行测试

案例代码:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

// 定义一个自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    // 定义一个String类型的value属性
    String value();
}

// 定义一个测试类
public class TestClass {

    // 定义一个测试方法,并使用自定义的Test注解
    @Test(value = "测试 add 方法")
    public void testAdd() {
        int result = 1 + 2;
        assertEquals(3, result);
    }

    @Test(value = "测试 subtract 方法")
    public void testSubtract() {
        int result = 5 - 3;
        assertEquals(2, result);
    }

    // 定义一个断言方法
    public static void assertEquals(int expected, int actual) {
        if (expected != actual) {
            throw new RuntimeException("测试失败:期望值=" + expected + " 实际值=" + actual);
        }
    }
}

// 执行测试
public class TestRunner {

    public static void main(String[] args) {
        Class<?> testClass = TestClass.class;
        try {
            // 获取测试类对象
            Object testInstance = testClass.newInstance();
            
            // 遍历测试类中的所有方法
            for (Method method : testClass.getMethods()) {
                // 检查方法是否使用了Test注解
                if (method.isAnnotationPresent(Test.class)) {
                    try {
                        // 执行测试方法
                        method.invoke(testInstance);
                        System.out.println("测试成功:" + method.getAnnotation(Test.class).value());
                    } catch (Exception e) {
                        System.out.println("测试失败:" + method.getAnnotation(Test.class).value());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结语:

    以上内容涵盖了JUnit单元测试、反射机制、注解的概念及自定义,以及如何解析注解并应用在简单的测试框架案例中。这些知识点对于Java后端开发中的框架设计、代码规范以及测试都非常重要。通过这些知识点的学习,可以加深对Java高级特性的理解,并为后续框架学习和项目开发打下基础。

#JavaWeb

欢迎大家交流,金三银四求职季期间关注公众号送面试宝典。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/435718.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于制作一个Python小游戏(三)

目录 前言: 在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现 1.敌机的设计: 1.1敌机出场的实现: 1.1.1游戏启动后,每个一秒钟出现一架敌方飞机 1.1.2每架敌机向屏…

机器人期刊:Science Robotics and IEEE Transactions

文章目录 1. Science Robotics (出版商 AAAS)2. IEEE Transactions on RoboticsReference1. Science Robotics (出版商 AAAS) https://www.science.org/journal/scirobotics 2. IEEE Transactions on Robotics

来,我们把LangChain了解一下

目录 LangChain简介 LangChain Experssion Language 常见API key申请 LangChain简介 最近要学的东西可太多了&#xff0c;好的&#xff0c;我们先来看看LangChain是什么东西&#xff0c;咱就是说开干吧&#xff1a; pip install langchain Get started吧&#xff1a;Get …

基于 EfficientNetV2 实现判别MNIST 手写模型分类

pytorch深度学习项目实战100例 的学习记录 我的环境&#xff1a; 白票大王&#xff1a; google colab 用其他的话&#xff0c;其实实现也行&#xff0c;但是让小白来重环境来开始安装的话&#xff0c;浪费时间 论文速读 EfficientNetV2是由 Google Research&#xff0c;Br…

(3)(3.3) MAVLink高延迟协议

文章目录 前言 1 配置 2 说明 3 消息说明 前言 ArduPilot 支持 MAVLink 高延迟协议(MAVLink High Latency)。该协议专为卫星或 LoRA 等低带宽或高成本链路而设计。 在此协议中&#xff0c;每 5s 只发送一次 HIGH_LATENCY2 MAVLink 信息。对 MAVLink 命令或请求&#xff08…

Java常用类库:Math类

在Java编程语言中&#xff0c;java.lang.Math类提供了一系列用于执行基本数学运算的静态方法。这些方法允许你执行各种数学计算&#xff0c;如三角函数、指数函数、对数函数、取整函数等。在本教程中&#xff0c;我们将介绍Math类的常用方法及其用法。 常用方法 以下是Math类…

小迪安全33WEB 攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

#知识点&#xff1a; 1、中间件安全问题 2、中间件文件上传解析 3、Web 应用编辑器上传 编辑器也就是第三方插件&#xff0c;一般都是文件上传漏洞 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完…

linux安装ngnix

一、将nginx-1.20.1.tar.gz上传至linux服务器目录下 二、将nginx安装包解压到/usr/local目录下 tar -zxvf /home/local/nginx-1.20.1.tar.gz -C /usr/local/三、预先安装依赖 yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc gcc-c auto…

部署LVS负载均衡架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

Python算法100例-3.7 高次方数的尾数

1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序 1&#xff0e;问题描述 求13的13次方的最后三位数。 2&#xff0e;问题分析 许多初学者看到本题最容易想到的方法就是&#xff1a;将13累乘13次后截取最后三位即可。但是计算机中存储的整数是有一定范围的&#…

视频扩散模型介绍 Video Diffusion Models Introduction

视频扩散模型介绍 Video Diffusion Models Introduction Diffusion 扩散模型中的一些概念DDPMDDIMCLIPLatent DiffusionStable DiifusionLoRADreamBoothControlNet 视频生成评估标准图片层面视频层面 前人的工作Make-A-VideoAlign your Latents 开源视频生成模型ModelScopeT2V&…

vant van-field 密码输入框小程序里隐藏、显示密码bug总结

老规矩先上效果图: vant 输入框组件 密码的隐藏与显示功能&#xff1a; 注: 用password属性控制密码的显示与隐藏 不要用type属性&#xff0c;type属性在真机上有时会没有效果 1、当然如果只用typepassword 不需要切换显示、隐藏也可以使用。 2、如果用到了密码的显示与…

pandas数据合并

import pandas as pd import numpy as np# 随机生成两个df df1 pd.DataFrame(np.random.randn(3,4),columns [A,B,C,D]) df2 pd.DataFrame(np.random.randn(2,3),columns [A,B,D])print(打印df1\n,df1) print(打印df2\n,df2)# 默认纵向合并 qh_df_z pd.concat([df1,df2]) …

掌握Nodejs高级图片压缩技巧提升web优化

掌握Nodejs高级图片压缩技巧提升web优化 在当今的数字时代,图像在网络开发中发挥着至关重要的作用。它们增强视觉吸引力、传达信息并吸引用户。然而,高质量的图像通常有一个显着的缺点——较大的文件大小会减慢网页加载时间。为了应对这一挑战并确保快速加载网站,掌握 Node…

高中信息技术教资学习

一、几种排序方法的基本思想 1、直接插入排序&#xff08;假设按照从小到大进行排序&#xff09; 默认第一个元素是有序的&#xff0c;从有序的元素末尾开始&#xff0c;与要插入的元素进行比较&#xff0c;如果要插入的元素比有序的末尾元素小的话&#xff0c;就将有序末尾元…

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在&#xff0c;让我们开始体验“说明提示技巧”&#xff08;IPT, Instructions Prompt Technique&#xff09;和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

图神经网络实战(4)——基于Node2Vec改进嵌入质量

图神经网络实战&#xff08;4&#xff09;——基于Node2Vec改进嵌入质量 0. 前言1. Node2Vec 架构1.2 定义邻居1.2 在随机游走中引入偏向性1.3 实现有偏随机游走 2. 实现 Node2Vec小结系列链接 0. 前言 Node2Vec 是一种基于 DeepWalk 的架构&#xff0c;DeepWalk 主要由随机游…

Vue源码系列讲解——过滤器篇【三】(解析过滤器)

目录 1. 前言 2. 在何处解析过滤器 3. parseFilters函数分析 4. 小结 1. 前言 在上篇文章中我们说了&#xff0c;无论用户是以什么方式使用过滤器&#xff0c;终归是将解析器写在模板中&#xff0c;既然是在模板中&#xff0c;那它肯定就会被解析编译&#xff0c;通过解析用…

【ESP32 IDF快速入门】点亮第一个LED灯与流水灯

文章目录 前言一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、GPIO操作函数2.1 GPIO 汇总2.2 GPIO操作函数gpio_config配置引脚reset 引脚函数设置引脚电平选中对应引脚设置引脚的方向 2.3 点亮第一个灯 三、流水灯总结 前言 ESP32…

【Godot4.2】GDScript数组分类及类型化数组和紧缩数组概述

概述 GDScript的数组是一种很常用的数据类型。本文主要阐述一下GDScript数组分类&#xff0c;以及官方文档和大多数视频或教程较少提及的类型化数组和紧缩数组。 GDScript数组分类 通过反复查阅GDScript内置文档并进行细节比较&#xff0c;发现GDScript的数组&#xff0c;可…