Java从入门到精通(十三)~ 枚举和注解

news2024/9/20 1:02:17

 晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。

文章目录

目录

 

前言

一、枚举

1.1 枚举的概念

​编辑 

1.2 枚举的特点

1.3 枚举的实际运用

1. 状态机,描述属性的多种状态

2.  策略模式,让客户端动态切换不同的策略

 3. 数据字典,定义一组错误代码展示对应的错误消息

4. 迭代器模式,枚举类型的循环使用

二、注解

2.1 注解的概念

2.注解的特点

2.1 格式:

2.2 注解的分类

1. 内置注解:

2. 自定义注解:

2.3 用途

2.4 使用反射获得是否被指定注解修饰

1. 判断类是否被注解修饰

 2. 判断方法是否被注解修饰

2.5 模拟tomcat输入对应的路径执行对应的方法 

1. 自定义@Controller注解

2. 自定义@RequestMapping注解

 3. 自定两个控制器

 4. 模拟tomcat

总结



前言

        枚举和注解都是 Java 中重要的语言特性,枚举用于定义常量集合和类型安全,而注解是元数据的一种形式,可以在代码中添加元数据信息,用来提供给编译器和其他工具进行特定的处理。通过合理使用枚举和注解,可以提高代码的可读性、灵活性和功能性。注解就一句核心:注解是给程序看的注释,注解离开了反射什么也不是。


一、枚举

枚举是一种特殊的数据类型,用于定义一组命名的常量集合。

1.1 枚举的概念

1. 类被public final修饰,默认继承Enum类,因此不能被继承也不可继承。

2. 成员变量默认被public static final enum修饰,并且多个成员之间用逗号隔开,会按照声明顺序按照0开始分配序号。name值为变量名。CompareTo默认根据序号比较。

3. 默认:直接打印返回的是变量名。因为底层toString()方法默认返回name

 

1.2 枚举的特点

  1. 声明常量集合:枚举允许开发者定义一组具名的常量,这些常量在整个程序中可以被安全地引用。

  2. 类型安全:枚举提供了类型安全性,编译器会检查枚举常量的使用,避免使用错误的常量值。

  3. 增强代码可读性:通过枚举,可以使用具有语义的名称来表示常量,提高代码的可读性和可维护性。

  4. 支持方法和属性:枚举不仅可以包含常量,还可以定义方法和属性,使得枚举可以拥有更复杂的行为。

  5. switch 语句的支持:Java 的枚举可以很方便地与 switch 语句结合使用,提高代码的简洁性和可读性。

1.3 枚举的实际运用

1. 状态机,描述属性的多种状态

标记一个商品表中的订单属性的状态,其中含有枚举常量,新订单、处理中、完成、取消

package enum_demo1;

/**
 * @author windStop
 * @version 1.0
 * @description 枚举作用一:状态机
 * @date 2024年07月26日16:05:43
 */
//枚举订单状态
enum OrderStatus {
    NEW,        // 新订单
    PROCESSING, // 处理中
    COMPLETED,  // 完成
    CANCELED;   // 取消
}
//订单JavaBean
class Order {
    private OrderStatus status;

    public OrderStatus getStatus() {
        return status;
    }

    public void setStatus(OrderStatus status) {
        this.status = status;
    }
}
public class FiniteStateMachine {
    public static void main(String[] args) {
        Order order = new Order();
        //1. 获取订单状态
        OrderStatus currentStatus = order.getStatus();
        //2. 设置订单状态
        order.setStatus(OrderStatus.NEW); // 设置为新订单状态
        order.setStatus(OrderStatus.PROCESSING); // 设置为处理中状态
        order.setStatus(OrderStatus.COMPLETED); // 设置为完成状态
        order.setStatus(OrderStatus.CANCELED); // 设置为取消状态
        //3. 使用订单状态
        if (order.getStatus() == OrderStatus.NEW) {
            // 处理新订单的逻辑
        } else if (order.getStatus() == OrderStatus.PROCESSING) {
            // 处理处理中的订单逻辑
        } else if (order.getStatus() == OrderStatus.COMPLETED) {
            // 处理完成的订单逻辑
        } else if (order.getStatus() == OrderStatus.CANCELED) {
            // 处理取消的订单逻辑
        }

    }
}

2.  策略模式,让客户端动态切换不同的策略

策略模式(Strategy Pattern)是一种行为设计模式,它允许定义一系列算法,并将每种算法封装到具有共同接口的独立类中,使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,从而使得客户端可以根据需要在运行时选择算法

模拟用户选择的按钮选择对应的支付方式。 

package enum_demo2;
/**
 * @author windStop
 * @version 1.0
 * @description 枚举作用二:策略模式
 * @date 2024年07月26日16:06:26
 */
public enum PaymentMethod {
    CREDIT_CARD {
        @Override
        public void pay(double amount) {
            // 实现信用卡支付逻辑
        }
    },
    PAYPAL {
        @Override
        public void pay(double amount) {
            // 实现PayPal支付逻辑
        }
    },
    BANK_TRANSFER {
        @Override
        public void pay(double amount) {
            // 实现银行转账支付逻辑
        }
    };

    public abstract void pay(double amount);
}

 3. 数据字典,定义一组错误代码展示对应的错误消息

通过枚举类型 ErrorCode 来定义一组固定的错误代码和对应的错误消息,以提高代码的可读性和维护性,并用于统一管理常量值或数据字典。

package enum_demo3;

/**
 * @author windStop
 * @version 1.0
 * @description 枚举作用三:用枚举类来表示数据字典或常量值
 * @date 2024年07月26日16:11:07
 */
public enum ErrorCode {
    INVALID_INPUT(1001, "Invalid input"),
    NETWORK_ERROR(2001, "Network error"),
    DATABASE_ERROR(3001, "Database error");

    private final int code;
    private final String message;

    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

4. 迭代器模式,枚举类型的循环使用

虽然这里称为迭代器模式,但更确切地说,它展示了枚举类型的循环使用。通过 getNextDay 方法,可以方便地获取当前一周中某一天的下一天,使得处理周期性任务或日期操作更加便捷和可读。 

package enum_demo4;
/**
 * @author windStop
 * @version 1.0
 * @description 枚举功能四:迭代器模式
 * @date 2024年07月26日16:14:24
 */
public enum Weekday {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    /**
     * getNextDay 是一个静态方法,用于获取当前给定 currentDay 的下一天是什么。
     * @param currentDay
     * @return
     * currentDay.ordinal() 返回 currentDay 枚举常量的序号(从 0 开始)。
     * values() 方法返回 Weekday 枚举类型的所有枚举常量的数组。
     * (currentDay.ordinal() + 1) % values().length 计算出当前 currentDay 的下一个枚举常量的序号。由于枚举是循环的,所以用取模运算确保循环。
     * values()[...] 使用计算得到的序号获取下一个枚举常量。
     */
    public static Weekday getNextDay(Weekday currentDay) {
        return values()[(currentDay.ordinal() + 1) % values().length];
    }
}

二、注解

2.1 注解的概念

        Java 注解(Annotation)是 Java 语言提供的一种元数据(metadata)机制,用于在源代码中添加关于程序元素的额外信息,这些信息可以被编译器、工具和运行时框架使用。注解以 @ 符号开头,放置在类、方法、变量等元素的定义前面。给程序的注释。

        注解本身是没有任何作用的,注解只是用来标记,而这个注解真正的功能都是由框架通过反射来实现的。离开了反射什么也不是。

2.注解的特点

注解只有成员变量没有方法。注解的属性在注解的定义中以“无形参的抽象方法”形式来声明,其方法名定义了该属性的名字,其返回值定义了该属性的类型。

默认会继承java.lang.annotation.Annotation 接口。

2.1 格式:

public @interface MyAnno {
    String value();
    String name() default "匿名";
    int age() default 21;
}
  1. 看似属性很像一个 抽象类,可千万不要理解成抽象类。
  2. 这些成员变量用于定义注解的元素。编译器会在底层自动生成相关的接口和方法,以便在运行时获取注解的元数据。
  3. 注解的属性在注解的定义中以“无形参的抽象方法”形式来声明,其方法名定义了该属性的名字,其返回值定义了该属性的类型
  4. default 声明默认值。

2.2 注解的分类

1. 内置注解:
  • 元注解: 用于注解其他注解的注解,如 @Retention@Target@Documented 等。


     
  • 预定义注解: Java提供了一些内置的注解,如 @Override@Deprecated@SuppressWarnings 等,用于标记方法的重写、标记过时的方法或类、抑制编译器警告等。
  1. @Override:用于标识一个方法覆盖了父类中的方法。

  2. @Deprecated:用于标记已过时的方法、类或字段,表示不推荐使用,通常是因为有更好的替代方法。

  3. @SuppressWarnings:抑制编译器警告,可以用于方法、类、字段等,告诉编译器忽略特定的警告信息。

  4. @SafeVarargs:用于抑制 Java 编译器关于使用可变参数方法时的警告信息。

  5. @FunctionalInterface:用于指示接口类型是一个函数式接口,即只包含一个抽象方法的接口,可以用作 Lambda 表达式的类型。

  6. @Native:用于标记一个方法是本地方法,即通过 JNI(Java Native Interface)调用的方法。

  7. @Target:用于指定注解可以应用的地方,例如方法、类、字段等。

  8. @Retention:用于指定注解的保留策略,即注解在什么级别可用,如源码(SOURCE)、类文件(CLASS)、运行时(RUNTIME)。

  9. @Documented:用于指定注解是否包含在 JavaDoc 中。

2. 自定义注解:
  • 可以定义自己的注解,通过元注解指定注解的使用方式、目标和保留策略,定义注解的成员变量来传递注解的参数信息,并通过反射进行获取。

1.定义自定注解

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
    String value();
    String name() default "匿名";
    int age() default 21;
}

2. 定义javabean

public class Student {
    @MyAnno("小明")
    private String name;
    private Integer age;
}

 3. 通过反射使用注解,并将注解的值赋值给javabean,从而实现spring中的@Value

package anno_demo1;

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

/**
 * @author windStop
 * @version 1.0
 * @description 测试注解
 * @date 2024年07月27日15:00:47
 */
public class Test{
    public static void main(String[] args) throws Exception{
        Class<Student> studentClass = Student.class;
        Student student = studentClass.getDeclaredConstructor().newInstance();
        Method[] declaredMethods = studentClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            method.setAccessible(true);
            // 判断方法上是否存在Init注解,存在就返回true,否则返回false
            if (method.isAnnotationPresent(MyAnno.class)) {
                // 返回该方法的注解
                MyAnno init = method.getAnnotation(MyAnno.class);
                // 执行这个方法并且将注解的值给其赋值
                method.invoke(student, init.value());
            }
        }
        Field name = studentClass.getDeclaredField("name");
        name.setAccessible(true);
        MyAnno annotation = name.getAnnotation(MyAnno.class);
        name.set(student,annotation.value());
        System.out.println(student);
    }
}

2.3 用途

  • 作用

    • 元数据标记:注解提供了一种在代码中添加元数据(metadata)的方式,用于描述类、方法、字段等程序元素的信息。
    • 编译时处理:可以在编译时和运行时通过反射机制获取注解信息,从而影响程序的行为。
    • 代码分析工具:许多开发工具和框架利用注解来配置和扩展应用,例如 Spring 框架中的 @Autowired@RequestMapping 等。
  • 在项目中的应用

    • 配置管理:用于配置和管理各种应用程序的行为和属性,如数据源配置、事务管理等。
    • 代码分析和验证:通过自定义注解来实现代码风格检查、安全检查等。
    • 框架集成:许多流行的框架和库都使用注解来简化配置和扩展,如 Spring、JUnit 等。
    • 文档生成:通过注解生成文档,如使用 Swagger 的 @Api 和 @ApiOperation 注解。

2.4 使用反射获得是否被指定注解修饰

1. 判断类是否被注解修饰
// 首先判断Test类上是否使用了TestAnnotation注解
boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
 2. 判断方法是否被注解修饰
method.isAnnotationPresent(MyAnno.class)

下述是一个代码找出所有被@MyAnno修饰的方法 ,并将value赋值给形参

public static void main(String[] args) throws Exception{
        Class<Student> studentClass = Student.class;
        Student student = studentClass.getDeclaredConstructor().newInstance();
        Method[] declaredMethods = studentClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            method.setAccessible(true);
            // 判断方法上是否存在Init注解,存在就返回true,否则返回false
            if (method.isAnnotationPresent(MyAnno.class)) {
                // 返回该方法的注解
                MyAnno init = method.getAnnotation(MyAnno.class);
                // 执行这个方法并且将注解的值给其赋值
                method.invoke(student, init.value());
            }
        }
}

 3. 判断属性是否被注解修饰

//判断属性有没有被注解修饰
        boolean annotationPresent = name.isAnnotationPresent(MyAnno.class);

取出name属性并将其上面的MyAnno注解的值赋值给其成员变量

        Student student = studentClass.getDeclaredConstructor().newInstance();        
        Field name = studentClass.getDeclaredField("name");
        name.setAccessible(true);
        
        MyAnno annotation = name.getAnnotation(MyAnno.class);
        name.set(student,annotation.value());
        System.out.println(student);

2.5 模拟tomcat输入对应的路径执行对应的方法 

1. 自定义@Controller注解

介绍使用到的元注解

@Target(ElementType.TYPE):该注解用于类上
@Documented:会生成到javadoc中
@Retention(RetentionPolicy.RUNTIME):该注解会被保留到运行时期

package anno_tomcat.tomcat_method;

import java.lang.annotation.*;

/**
 * @author windStop
 * @version 1.0
 * @description 标记注解:标记是一个请求控制器
 * @date 2024年07月27日20:04:38
 */
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Controller {
    String[] value() default "";
}
2. 自定义@RequestMapping注解

自定在方法上。生效到运行时期

package anno_tomcat.tomcat_method;

import java.lang.annotation.*;

/**
 * @author windStop
 * @version 1.0
 * @description 映射路径注解
 * @date 2024年07月27日20:11:44
 */
@Target(ElementType.METHOD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestMapping {
    String value();
}
 3. 自定两个控制器
package anno_tomcat.tomcat_method;

/**
 * @author windStop
 * @version 1.0
 * @description 测试:给方法声明注解的作用,获取URL和请求路径
 * @date 2024年07月27日20:03:51
 */
@SuppressWarnings("all")
@Controller
public class StudentController {

    @RequestMapping("/addStudent")
    public boolean addStudent(int id){
        System.out.println("学生添加成功");
        return true;
    }

    @RequestMapping("/updateStudent")
    public boolean updateStudent(int id){
        System.out.println("学生修改成功");
        return true;
    }

    @RequestMapping("/deleteStudent")
    public boolean deleteStudent(int id){
        System.out.println("学生删除成功");
        return true;
    }

    @RequestMapping("/getStudent")
    public Student getStudent(String name){
        System.out.println("学生查询成功");
        return new Student(name,18);
    }
}
package anno_tomcat.tomcat_method;

/**
 * @author windStop
 * @version 1.0
 * @description 测试book
 * @date 2024年07月27日21:21:38
 */
@Controller
public class BookController {
    @RequestMapping("/showBook")
    public void show(int a){
        System.out.println("show方法");
    }

    @RequestMapping("/addBook")
    public void addBook(int a) {
        System.out.println("正在添加图书");
    }
}
 4. 模拟tomcat

我现在是tomcat开发程序员,我现在要使用未来某个时刻的二逼程序员写的代码。

思路分析:

  1. 首先,我不知道他是什么时候写的,并且类名叫什么
  2. 但我可以给他提供一个规范,就是实现@Controller注解,并且项目在当前包中,路径映射写在@RequestMapping中。
  3. 最后,他只要符合我的要求,我就可以使用他的代码。

代码分析:

  1. 不知道程序员什么时候写,那就需要使用反射的Class.forName(className),来在运行时动态加载类的机制,适合需要根据运行时条件加载不同类的场景。
  2. 扫描含有@Controller注解的全类名,进行获取反射类,然后获取出所有方法,在扫描出含有@RequestMapping,注解并且提取其属性和你输入属性对比,相同调用其注解标识的方法。
package anno_tomcat.tomcat_method;


import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @author windStop
 * @version 1.0
 * @description 模拟tomcat,使用用户的代码
 * @date 2024年07月27日20:14:06
 */
public class TomcatDemo {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        //1. 获取全类名
        List<String> listClass = findClass("anno_tomcat.tomcat_method");
        String url = sc.next();//用户输入的url
        for (String className : listClass) {
            Class<?> aClass = Class.forName(className);
            //2. 判断是否包含Controller注解
            if (aClass.isAnnotationPresent(Controller.class)) {
                //创建javabean对象
                Object o = aClass.getDeclaredConstructor().newInstance();
                //3. 根据输入的全类名执行对应的方法
                 //忽略 用户输入的 /
//                url = url.replace("/", "");
                Method[] methods = aClass.getDeclaredMethods();
                for (Method method : methods) {
                    //4. 只查询被@RequestMapping修饰的方法
                    if (method.isAnnotationPresent(RequestMapping.class)){
                        // 获取注解,这个相当于是真正的拿到注解了,只有获取到这个才能获取到注解当中设置的值
                        RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                        if (url.equals(annotation.value())){
                            method.invoke(o,0);
                        }
                    }
                }
            }
        }

    }

    /**
     * 查找指定路径的全类名
     * @return
     */
    public static List<String> findClass(String packageName){//指定要查看的包名
        String packagePath = packageName.replace('.', '\\'); // 将包名转换为路径格式
        List<String> result = new ArrayList<>();
        // 获取当前工作目录下指定包的路径
        String currentDirectory = System.getProperty("user.dir");
        String packageDirectoryPath = currentDirectory + "\\src\\" + packagePath;
        File packageDirectory = new File(packageDirectoryPath);
        // 检查该路径是否存在且为目录
        if (packageDirectory.exists() && packageDirectory.isDirectory()) {
            // 获取目录下的文件列表
            File[] files = packageDirectory.listFiles();//获得所有子文件
            if (files != null) {
                for (File file : files) {
                    String str = packageName;//包名
                    str = str + "." + file.getName();//全类名
                    //删除.java后缀
                    //找出最后一个点的位置
                    int lastIndex = str.lastIndexOf('.');
                    str = str.substring(0,lastIndex);
                    result.add(str);
                }
            } else {
                System.out.println("在包中找不到文件 " + packageName);
            }
        } else {
            System.out.println("包 " + packageName + " 没有找到");
        }
        return result;
    }
}

总结

        这二者在以后Spring框架中是十分重要的,在Spring框架中,枚举(Enums)和注解(Annotations)各自发挥着重要的作用。枚举通常用于定义常量集合和限制参数取值范围,增强代码的可读性和安全性。而注解则用于声明依赖关系、配置项、AOP切面、事务管理以及RESTful API映射等方面,提供了声明式和便捷的编程方式。枚举和注解的结合使得Spring应用更加灵活、简洁和易于维护,是现代Java开发中不可或缺的核心特性。因此我觉得他们是非常值得我们学习的知识。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App Inventor 2 低功耗蓝牙 BlueToothLE 拓展中文文档(完整翻译加强版)

低功耗蓝牙&#xff0c;也称为蓝牙LE 或简称 BLE&#xff0c;是一种类似于经典蓝牙的新通信协议&#xff0c;不同之处在于它旨在消耗更少的功耗和成本&#xff0c;同时保持同等的功能。 因此&#xff0c;低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE 扩…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

文件系统基础 (二)——文件的物理结构

目录 一. 前言二. 连续(顺序)分配三. 链接分配隐式链接显式链接 三. 索引分配单级索引分配多级索引分配混合索引分配混合索引分配相关计算 五. 总结 一. 前言 文件的物理结构就是研究文件的实现&#xff0c;即文件数据在物理存储设备上是如何分布和组织的。 文件的分配方式&a…

【计算机网络原理】网络层IP协议的总结和数据链路层以太网协议的总结.

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package

conda issuehttp://t.csdnimg.cn/ndZZK 目录 常规安装 检索包资源 获取指定包的安装源&安装指令 安装指定包 常规安装 conda 常规安装xxx包 conda install xxx conda install有可能会受限于channel导致报错PackagesNotFoundError: The following packages are not av…

RedisTemplate、StringRedisTemplate、序列化器配置

Lettuce和Jedis RedisTemplate是SpringDataRedis中对JedisApi的高度封装&#xff0c;提供了Redis各种操作、 异常处理及序列化&#xff0c;支持发布订阅。 首先我们要知道SpringData是Spring中数据操作的模块&#xff0c;包括对各种数据库的集成&#xff0c;比如我们之前学过…

SpringBoot轻松实现多数据源切换

一.需求背景 项目需要实现在多个数据源之间读写数据&#xff0c;例如在 A 数据源和 B 数据源读取数据&#xff0c;然后在 C 数据源写入数据 或者 部分业务数据从 A 数据源中读取、部分从B数据源中读取诸如此类需求。本文将简单模拟在SpringBoot项目中实现不同数据源之间读取数…

数据结构:二分图以及判定二分图

文章目录 一、二分图的基本知识1、特性2、图示3、检查一个图是否为二分图3.1、着色的算法原理和思路3.2、算法示例&#xff1a;使用 BFS 检查二分图3.3、算法示例&#xff1a;使用 DFS 检查二分图 4、应用 二、例题1.LeetCode&#xff1a;785. 判断二分图2.Acwing&#xff1a;8…

软件开发中UML的基本概念与UML类图中存在哪些关系与如何绘制?

UML的概述 UML在维基百科中是这样子描述的 可以使用的工具这里网上说的有些花哨,我自己一般使用processon,里面的UML相关功能就很全。 UML类图的相关概念解释 解释一下什么是类图? 定义系统中的类,描述系统中类的属性和方法,就是描述类的内部结构,表示类与类之间的关…

手摸手教你撕碎西门子S7通讯协议04--S7COMM请求

1、S7通讯回顾 - &#xff08;1&#xff09;建立TCP连接 Socket.Connect-》已实现 - &#xff08;2&#xff09;发送访问请求 COTP-》已实现 - &#xff08;3&#xff09;交换通信信息 Setup Communication-》本节实现 - &#xff08;4&#xff09;执行相关操作 …

诱骗IoT恶意软件跟踪CC服务器

工作背景 在分析 IoT 僵尸网络时&#xff0c;识别C&C 服务器至关重要。C&C 服务器的 IP 地址一直都是商业威胁情报的重要组成部分&#xff0c;由于 C&C 服务器通信协议日渐复杂并且活跃周期较短&#xff0c;时效性和准确性也非常重要。如果可以自动化识别 IoT 恶意…

深度学习实战笔记3循环神经网络实现

我们要训练一个基于循环神经网络的字符级语言模型&#xff0c;根据用户提供的文本的前缀生成后续文本。 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l batch_size, num_steps 32, 35 train_iter, voc…

防震减灾知识竞赛的规则和流程方案

防震减灾知识竞赛的规则主要包括赛制、比赛形式、参赛对象、竞赛内容等方面。 赛制&#xff1a;通常包括选拔赛、分区预赛和全国决赛三个阶段。选拔赛可以根据地区实际情况选择合适的组织形式&#xff0c;预赛和决赛则以现场比赛形式进行&#xff0c;由主办单位统一组织。 比…

掌握 Spring Boot + MyBatis-Plus 动态数据源切换,只要5分钟!

数据量猛增&#xff0c;通过动态数据源切换&#xff0c;我们不仅能提高查询效率&#xff0c;还能保证系统的高可用性。 通过将写操作集中在主库&#xff0c;读操作分散到多个从库&#xff0c;可以有效减轻数据库的压力。 在pom.xml中添加以下依赖&#xff1a; xml <depend…

记录|LabVIEW从0开始

目录 前言一、表达式节点和公式节点二、脚本与公式2.1 公式 三、Excel表格3.1 位置3.2 案例&#xff1a;波形值存入Excel表中3.3 案例&#xff1a;行写入&#xff0c;列写入 四、时间格式化4.1 获取当前时间4.2 对当前时间进行格式化 更新时间 前言 参考视频&#xff1a; LabVI…

hadoop学习(二)

一.MapReduce 1.1定义&#xff1a;是一个分布式运算程序的编程框架 1.2核心功能&#xff1a;将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 1.3优点 1&#xff09;易于编程 它简单的实现一些接口&#…

从入门到精通:电商设计师的职业发展指南

在当今数字时代&#xff0c;电商设计师的作用越来越重要。从电子商务网站的整体造型设计到产品页面的具体布局&#xff0c;他们的工作范围是电子商务企业成功的关键因素之一。然而&#xff0c;并不是每个人都对这个职业有深刻的理解。因此&#xff0c;在本文中&#xff0c;我们…

web3d值得学习并长期发展,性价比高吗?

在数字化浪潮日益汹涌的今天&#xff0c;Web3D技术以其独特的魅力和广泛的应用前景&#xff0c;逐渐成为技术领域的焦点。对于许多热衷于技术探索和创新的人来说&#xff0c;学习并长期发展Web3D技术无疑是一个值得考虑的选择。那么&#xff0c;Web3D技术的学习和发展究竟是否性…

华为openEuler 24.03 LTS系统安装系统后用SSH工具不能连接

sudo dnf install vim #安装VIM vim /etc/ssh/sshd_config #修改文件如图systemctl restart sshd #重启服务再用SSH工具连接成功

【树莓派+OpenCV+STM32】智能小车巡线_提取线路数据并通过串口通信传输

一、所用材料 树莓派4B树莓派官方摄像头STM32F103C8T6最小系统板 二、实现功能 在树莓派上用OpenCV对摄像头中的图像进行处理&#xff0c;将图像处理后的数据通过串口通信给到下位机STM32F103C8T6&#xff0c;再由下位机给出控制信号&#xff0c;利用pid算法实现对小车运动轨…