Java程序设计——注解(Java高级应用)

2023-10-26

目录

一、基本注解

1.@Override注解

2.@Deprecated注解

3.@SuppressWarnings注解

4.@SafeVarargs注解(?)

5.@FunctionalInterface注解

二、定义注解

三、使用注解

四、元注解

 1.@Retention注解

2.@Documented文档注解

3.@Target注解

4.@Inherited注解

5.@Repeatable注解

6.类型注解


注解就像修饰符一样,使用时在前面增加@符号,用于修饰包、类、构造方法、域、方法、参数、局部变量的声明,这些信息被存在注解的“name=values”键值对中

注解不影响程序代码的运行,无论增加还是删除注释,代码都始终如一的执行

如果希望程序中的注解在运行时起到一定的作用,需要通过配套的工具对注解中的信息进行访问和处理,这种工具称为APT(注解处理工具)

APT注解处理工具负责提取注解中包含的元数据,并根据这些元数据增加额外功能

元数据的作用如下:

  • 编写文档——通过注解中标识的元数据可以生成doc文档
  • 代码分析——通过注解中标识元数据,使用反射对代码进行分析
  • 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,如@Overrride重写

一、基本注解

1.@Override注解

@Override注解用于指定方法的重写,强制一个子类必须覆盖父类的方法

public class OverrideDemo {
    public static void main(String[] args) {
        Father obj = new Son();
        obj.Info();
    }
}
class Father{
    public void Info(){
        System.out.println("父类的Info方法");
    }
}
class Son extends Father{

    //  使用@Override指定下面必须重写父类的方法
    @Override
    public void Info(){
        System.out.println("子类的Info方法");
    }
}

通过运行结果,可能看不出@Overrride注解的作用,此时将@Overrride注解删除,程序运行结果保持不变

因为@Override注解的作用是告诉编译器检查Son类的Info()方法,并保证父类也要有一个Info()方法,否则编译出错

2.@Deprecated注解

@Deprecated注解标识某个程序元素(接口、类、方法)已过时

public class DeprecatedDemo {
    public static void main(String[] args) {
        new DeprecatedDemo().oldMethod();
    }

    @Deprecated
    public void oldMethod(){
        System.out.println("使用过时的方法会被编译警告...");
    }
}

上述代码中,oldMethod()方法使用@Deprecated注解修饰该方法已过时,因此会引起编译器警告,而不是错误,结果依然可以输出

3.@SuppressWarnings注解

@SuppressWarning注解允许开发人员控制编译器警告的发布且会一直作用于该元素的所有子元素,可以标注在类、字段、方法、参数、构造方法以及局部变量上

语法格式如下:

import java.util.ArrayList;
import java.util.List;

// 忽略因使用泛型而未限制类型而产生的警告
@SuppressWarnings("rawtypes")
public class SuppressWarningsDemo {
    public static void main(String[] args) {
        List list = new ArrayList();
    }
}

4.@SafeVarargs注解(?)

“堆污染”是将一个不带泛型的变量赋值给一个带泛型的变量,将导致泛型变量污染

抑制堆污染警告的三种方法:

  • 使用@SafeVarargs注解(Java 7专供)
  • 使用@SuppressWarnings(“unchecked”)修饰
  • 编译时使用-Xlint:varargs选项

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SafeVarargsDemo {
    public static void main(String[] args) {
      Test(Arrays.asList("Hello"), Arrays.asList(" World!"));
      // Arrays.asList:将数组或元素的内容转换为集合
    }

    @SafeVarargs
    public static void Test(List<String>... list){ //  可变参数(形参个数==数组个数)
        List[] listArray = list;   //  Java不支持泛型数组,所以将List<String> == List[],从而导致堆污染
        List<Integer> listInteger = new ArrayList<>();
        listInteger.add(88);
        //  把listInteger赋值给listArray的第一个元素
        listArray[0] = listInteger;
        System.out.println(listArray[0].get(0));
    }
}

注意:@SafeVarargs注解不适用于非 static 或非 final 声明的方法,对于未声明为 static 或 final 的方法,如果要抑制 unchecked 警告,可以使用 @SuppressWarnings 注解。

5.@FunctionalInterface注解

@FunctionalInterface注解用于指定某个接口必须是函数式接口,Java8规定,如果一个接口中只有一个抽象方法,则该接口就是函数式接口

@FunctionalInterface注解只能修饰接口,不能修饰程序其他元素

// 函数式接口:只包含一个抽象方法
@FunctionalInterface
public interface FunctionalInterfaceDemo {
    public abstract void abstractMethod1();
   // public abstract void abstractMethod2();
}


二、定义注解

定义一个新的注解类型与定义一个接口非常相似,在原有的interface关键字前增加@符号

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnol {

    //  1.注解的成员由未实现的方法组成
    String test1();
    int test2();

    //  2.包含默认值的注解
    double test3() default 5.20;


/*
    //  3. 注解中的成员在使用时实现
    @MyAnnol(test1 = "这是test1()方法",test2 = 666)
*/
}

@Retention注解:指定自定义的注解可以保留多长时间,此处使用RetentionPolicy.RUNTIME保留策略值,该值是最长注解持续期,表明在程序运行时JVM通过反射获取注解信息


三、使用注解

注解大多是为其他工具提供运行信息或决策依据而设计的,任何JAVA程序都可使用反射来查询注解实例的信息

AnnotatedElement接口:用于在反射过程中获取注解信息,并为注解相关操作提供支持

方法 功能
Annotation getAnnotation(Class annotype) 返回调用对象的注解
Annotation getAnnotations() 返回调用对象的所有注解
Annotation getDeclareedAnnotations() 返回调用对象的所有非继承注解
Boolean isAnnotationPresent(Class annotype) 判断与调用对象相关联的注解是由annotype指定的

import java.lang.reflect.Method;

//  使用自定义的注解修饰类
@MyAnnol(test1 = "类注解", test2 = 886)
class MyClass{
    
    //  使用自定义的@MyAnnol注解修饰方法
    @MyAnnol(test1 = "不带参数的方法", test2 = 666,test3 = 22.2)
    public void methods(){

    }
}

public class MyAnnolDemo {
    public static void main(String[] args) throws NoSuchMethodException {
        //  1.获取MyClass类的注解
        MyAnnol myAnnol1 = MyClass.class.getAnnotation(MyAnnol.class);

        //  2.输出类注解信息
        System.out.println("MyClass类的注解信息:");
        System.out.println(myAnnol1.test1());
        System.out.println(myAnnol1.test2());
        System.out.println(myAnnol1.test3());
        System.out.println("---------------------");

        
        //  1.获取MyClass类的methods()方法
        Method myMethod = MyClass.class.getMethod("methods");

        //  2.获取MyClass类的methods()方法的注解
        MyAnnol myAnnol2 = myMethod.getAnnotation(MyAnnol.class);

        //  3.输出MyClass类的methods()方法注解的信息
        System.out.println("MyClass类的methods()方法的注解信息:");
        System.out.println(myAnnol2.test1());
        System.out.println(myAnnol2.test2());
        System.out.println(myAnnol2.test3());
    }
}

 

上述代码使用反射分别获取类和方法所关联的注解对象,无论类还是方法,都是通过getAnnotation()方法来获取注解对象

为了使用反射机制获取注解的相关信息,在定义注解时必须将注解的保留策略设置为RetentionPlolicy.RUNTIME,否则获取不到注解对象


四、元注解

元注解的作用:负责注册其它注解

 1.@Retention注解

@Rention注解:用于指定被修饰的注解可以保留多长时间

注册保留策略值:

策略值 功能
RetentionPolicy.SOURCE 注解只在源文件中保留,在编译期间删除
RetentionPolicy.CLASS 注解只在编译期间存在于.class文件中,运行时JVM不可获取注解信息,该策略值也是默认值
RetentionPolicy..RUNTIME 运行时JVM可以获取注解信息,是最长注解持续期
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)

public @interface myAnnotation {


}

2.@Documented文档注解

@Documented注解:用于指定被修饰的注解可以被javadoc工具提取成文档

import java.lang.annotation.Documented;

@Documented
public @interface myAnnotation {


}

3.@Target注解

@Target注解:用来限制注解的使用范围,即指定被修饰的注解能用于哪些程序单元

应用类型由ElementType枚举进行指定:

枚举值 功能
ElementType.TYPE 可以修饰类、接口、注解或枚举类型
ElementType.FIELD 可以修饰属性、包括枚举常量
ElementType.METHOD 可以修饰方法
ElementType.PARAMETER 可以修饰参数
ElementType.CONSTRUCTOR 可以修饰构造方法
ElementType.LOCAL_VARIABLE 可以修饰局部变量
ElementType.ANNOTATION_TYPE 可以修饰注解类
ElementType.PACKAGE 可以修饰包
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.TYPE) //  可以修饰类、接口、注解或枚举类型
@interface myAnnotation {

}

4.@Inherited注解

@Inherited注解:指定注解具有继承性

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface InheritedAnnol {
    String test1();
    int test2();
}
@InheritedAnnol(test1 = "继承注解", test2 = 666)
class Base{

}
public class InheritedDemo extends Base{
    public static void main(String[] args) {

        //  类InheritedDemo从父类Base中继承注解
        InheritedAnnol inheritedAnnol = InheritedDemo.class.getAnnotation(InheritedAnnol.class);

        //   输出注解中的成员信息
        System.out.println(inheritedAnnol.test1() + "--------" + inheritedAnnol.test2());

        //   判断InheritedDemo中是否具有@InhertedAnnol注解
        System.out.println(InheritedDemo.class.isAnnotationPresent(InheritedAnnol.class));
    }
}

5.@Repeatable注解

@Repeatable注解:用于开发重复注解

在Java8之前,同一个程序元素前只能使用一个相同类型的注解,如果需要在同一个元素前使用多个相同类型的注解,则必须通过注解容器来实现

从Java8开始,允许使用多个相同的类型的注解来修饰同一个元素,即在定义注解时要使用@Repeatable元注解进行修饰


import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface RepeatableContainer {    //  该注解是一个容器
    RepeatableAnnol[] value();      //  该容器可以接受多个@RepeatableAnnol注解
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(RepeatableContainer.class)
public @interface RepeatableAnnol {
    String name();
    char sex();
}

@RepeatableAnnol(name = "张三", sex = '男')
@RepeatableAnnol(name = "李四", sex = '女')
public class RepeatableDemo {
    public static void main(String[] args) {

        //  1.用Java8新增的getDeclaredAnnotationByType()方法获取修饰该类的多个RepeatableAnnol注解
        RepeatableAnnol[] repeatableAnnols =
                RepeatableDemo.class.getDeclaredAnnotationsByType(RepeatableAnnol.class);

        //  2.打印出数组中的@RepeatableAnnol注解
        for (RepeatableAnnol rs : repeatableAnnols) {
            System.out.println(rs.name() + "----------" + rs.sex());
        }


        //  3.使用传统的getDeclaredAnnotation()来获取修饰该类的@RepeatableContainer注解
        RepeatableContainer repeatableContainer =
                RepeatableDemo.class.getDeclaredAnnotation(RepeatableContainer.class);
        System.out.println(repeatableContainer);
    }
}

6.类型注解

类型注解:在定义枚举时使用@Target(ElementType.TYPE_USE)来修饰

枚举值:

  • TYPE_PARAMETER
  • TYPE_USE

除了在定义类、接口和方法等常见的程序元素时可以使用类型注解,以下位置也可使用类型注解进行修饰:

  • 创建对象(new)
  • 类型转换
  • implements实现接口
  • throws声明抛出异常
  • 方法参数

import java.io.Serializable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;

//  定义一个简单的类型注解,不带任何成员变量
@Target(ElementType.TYPE_USE)
@interface notNull{

}

//  1.定义类和实现接口时使用@notNull类型注解
@notNull public class ElementTypeDemo implements @notNull Serializable {

    //  2.throws抛出异常时使用@notNull类型注解
    public static void main(String[] args) throws @notNull Exception{

        //  3.创建对象时使用@notNull类型注解
        Object object = new @notNull Object();

        //  4.强制类型转换时使用@notNull类型注解
        String str = (@notNull String) object;

        //  5.泛型中使用@notNull类型注解
        List<String> list = new ArrayList<@notNull>();
    }
}

上述代码在各种情况下使用@notNull类型注解,这种无处不在的类型注解可以使编译器执行更严格的代码检查,从而提高程序的健壮性

上述代码虽然大量使用了@notNull类型注解,但这些注解不会起到任何作用。因为Java8本身并没有为这些类型注解提供处理工具,不能对类型注解执行检查框架

程序员可以通过第三方框架提供的检查工具,从而让编译器执行更严格的代码检查

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java程序设计——注解(Java高级应用) 的相关文章

  • java.io.Console - 类似于与标准输入重定向兼容的实用程序?

    某些 Java 库中是否有实用程序类提供类似的便利设施java io Console http docs oracle com javase 6 docs api java io Console html但与输入的 Bash 管道重定向兼容
  • 从另一个 Java 小程序访问 Java 小程序

    Web 应用程序使用 Java 小程序 该小程序将用户提交的密码存储在私有属性中 并在多个公共方法中使用该属性 我想知道从相同或不同网站加载的另一个 Java 小程序是否可以调用该小程序的方法或可能访问包含密码的私有属性 不同的小程序是在相
  • 如何在 JUnit 测试中引导weld-se

    我有一个用于单元测试的 Maven 项目 并且想使用 CDI 我已将weld se 依赖项放入 pom xml 中 如下所示
  • 最喜欢的开源 Google App Engine 应用程序(Java 或 Python)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • java中如何销毁进程

    我写了下面的代码 要从 Java 应用程序运行 bat 文件 我使用 process exec 但蝙蝠有时可能会挂起 所以我需要为此过程设置一个超时 我启动一个新线程并在线程中新建一个进程 我在线程中设置超时 并在超时时杀死线程 但我发现超
  • URI/URL 和 String 有什么区别?

    这是出于好奇 不需要代码 我尝试使用世界上最好的搜索引擎来获取答案 但没有发现任何有价值的东西 有什么区别URI URL以及表示该 URI URL 的字符串 为什么我们必须解析它 将字符串解析成什么URI URL对字符串进行不同的处理 为什
  • onErrorResume 和 doOnError 的区别

    Spring项目Reactor中 有什么区别onErrorResume and doOnError 我什么时候应该每个人 onErrorResume 当上游发生异常时提供回退流 doOnError 副作用运算符 假设您想记录上游发生的错误
  • Java 中的生命游戏,人口过剩但不明白为什么

    这是家庭作业 我在底部添加了相关代码 Problem 在试图允许用户调整网格大小时 网格现在被绘制得严重过度填充 截图 人口过剩 https i stack imgur com 0Ilrq png https i stack imgur c
  • 使用 JGit TreeWalk 列出文件和文件夹

    我想使用 JGit 显示头部修订的所有文件和文件夹的列表 我可以使用 TreeWalk 列出所有文件 但这不会列出文件夹 这是我到目前为止所拥有的 public class MainClass public static void main
  • 如何将C#中的时区信息转换为Java中的时区信息?

    我有一个系统 其中包含C 后端和一个Java前端 这C 后端与其他系统和一些移动设备通信 On the C 另一方面 我的任务之一是识别来自移动设备的时间戳的时区并创建相应的TimeZoneInfo目的 这是没有任何问题的工作 On the
  • 有没有办法将 spring boot 与 tcps 连接到数据库?

    我正在使用 Oracle 数据库 12c 和带有数据 JPA 的 Spring Boot 2 3 我的目标是连接钱包并将 TCPS 发送到数据库 当我搜索时 网上没有这方面的示例或指南 任何人都可以解释并举一些例子吗 如何从 Java 连接
  • 如何中断 java.util.Scanner nextLine 调用

    我正在使用多线程环境 其中一个线程通过重复调用不断侦听用户输入scanner nextLine 要结束应用程序 此运行循环将由另一个线程停止 但侦听线程不会停止 直到最后一个用户输入完成 由于nextLine 关闭流似乎不是一个选择 因为我
  • 发生异常时如何优雅地关闭Endpoint?

    我编写了一个小型 JAX WS Web 服务 它在容器外部运行Endpoint publish Endpoint endpoint Endpoint create new MyServiceImpl endpoint publish htt
  • 升级到 java 8 后无法使用 crashlytics 发布项目

    当我搬到java 8 我在应用程序发布中收到此错误 因为fabric崩溃解决方案 Could not determine the dependencies of task app crashlyticsStoreDeobsRelease g
  • 设置 sendBufferSize() 后,UDP 套接字的消息太长

    我正在尝试发送 UDP 数据报 包含协议缓冲区消息 并收到消息太长的异常 java io IOException Message too long at java net PlainDatagramSocketImpl send Nativ
  • 上传到服务器后,页面上只有一个 getter 起作用

    我有一个使用 Struts2 框架的网站 它在我的本地计算机上运行良好 但是当我将其上传到远程服务器 托管 时 一些 getter 和 setter 变得不调用 例如 操作 ForecastAction java JSP 预测 jsp 这是
  • Spring Hibernate:重新加载实体映射

    在 Web 应用程序中 我们使用 Spring 3 2 和 Hibernate 4 1 1 并实现类似插件的架构 可以在运行时添加和删除插件 对于每个模块 我们定义了一个单独的类加载器 并在 spring 上创建单独的子应用程序上下文 完整
  • 这是什么错误:位于 com.google.common.base.Preconditions.checkNotNull

    我是一名新的自动化测试人员 正在处理示例测试脚本 需要你们的一些帮助 我尝试过使用 POM 和基本的 TestNG 我创建了 2 个包 页面和测试用例 当我尝试从我的页面包访问 ClickJoin Enterusername 方法时 出现一
  • AspectJ 加载时间编织不适用于 Spring beans

    我正在开发一个项目 该项目使用 Spring 配置的 Java 而不是 xml 风格来连接依赖项 它还具有分析逻辑 应通过 AspectJ 将其编织到所需的方法上 通过注释 设置正在运行 我可以看到我想要的包中的类正在编织 并且分析信息已从
  • 将 Logcat 保存到 Android 设备中的文本文件

    我在 Android 设备中运行应用程序时发现一些崩溃 但模拟器中没有显示 所以我需要将 Logcat 保存在设备内存或 SD 卡中的文本文件中 您能建议我这样做的好方法吗 在应用程序的开头使用 Application 类 这允许正确的文件

随机推荐

  • Ubuntu16.04 64位下安装VMware Tools过程

    因为在虚拟机下安装Ubuntu16 04 64位时无法进入全屏模式 采用另外一种方法解决了 但是还是想安装一下VMware Tools 防止以后出现相关问题 好啦 下面进入正题 1 在虚拟机下会看到安装 VMware Tools 单击安装
  • C# 各种符号用法

    参考 C 的7种用法 c 软泡芙的博客 CSDN博客 C 问号操作符详解 知乎 的7种用法 可空类型修饰符 int i num null 表示可空的整型 DateTime time dateTime null 表示可空的时间 三元 运算符
  • join(long millis)意思?join()作用

    join 作用 class JoinThread implements Runnable public void run for int i 0 i lt 100 i System out println Thread currentThr
  • FT2232作为JTAG烧录器的使用步骤详解

    FT2232作为JTAG烧录器的使用步骤详解 FT2232作为JTAG烧录器的使用步骤详解 配置OpenOCD环境 已经配置好的可以跳过 步骤 1 安装 FT2232HL 芯片的驱动 安装文件为 CDM21228 Setup exe 步骤
  • unity AR3D物体识别

    上篇讲到了各种AR插件的一些对比 因为上个项目需求用到3D物体追踪 所以使用了EasyAR和Vuforia两种进行了测试对比 因为如果需要AR识别 都需要有识别点 大致都是基于物体材质纹理来进行识别 1 先讲一下EasyAR的3D物体识别
  • 【百问网】物联网项目学习总结

    初步实现项目 项目程序流程图 TCP连接流程 模式1 站点模式 写代码去实现了这个TCP的连接流程 我们的思路就是 首先直接操作ESP8266 进行功能验证 ST Link Debugger 点击Settings 勾选Reset and R
  • 远程访问数据库出错的解决办法

    案例 在aws服务器中的项目访问在华为云中的测试服务器的数据库 报错 Access denied for user root ec2 XXX XXX XXX XXX cn north 1 compute amazonaws com cn u
  • Linux指令系统文件复制到U盘

    Linux指令系统文件复制到U盘 文章目录 Linux指令系统文件复制到U盘 1 建立U盘挂载点 2 查看U盘所在分区 3 查看U盘类型 4 挂载U盘 5 复制文件 6 移除U盘 1 建立U盘挂载点 在挂载点处建立文件夹 mkdir 路径
  • 【Java面试题汇总】设计模式篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 谈谈你对设计模式的理解 谈谈你对单例模式的理解 手写一
  • [17]AWK记录、字段、模式、跨平台移植及正则表达式

    一 记录与字段 1 记录分隔符 默认行输入和输出的分隔符都是回车 保存在RS和ORS内部变量中 变量 0 awk每次一行取得整条记录 0随之改变 同时内部变量NF 字段的总数 也随之变化 变量NR 每条记录的行号 处理完一行将会加1 所以全
  • InnoDB undo log解析(二)

    在 上一篇中已经介绍了InnoDB undo log的组织结构 并通过一个示例并结合InnoSQL来分析insert undo log记录格式 本篇中介绍update undo log的记录格式 update undo log有以下三种类型
  • cocoeval 解析

    1 COCO目标检测比赛中的模型评价指标介绍 dulingwen的博客 CSDN博客 2 COCO目标检测测评指标 简书 1 Params类 对于COCO格式的数据检测 我们主要分为不同的IoU阈值 不同的面积范围 单张图片的最大检测数量
  • PAT 5 猴子吃桃问题(递归)

    猴子吃桃问题 15 分 一只猴子第一天摘下若干个桃子 当即吃了一半 还不过瘾 又多吃了一个 第二天早上又将剩下的桃子吃掉一半 又多吃了一个 以后每天早上都吃了前一天剩下的一半加一个 到第N天早上想再吃时 见只剩下一个桃子了 问 第一天共摘了
  • Nuxt 项目引入外部Js的正确姿势 ,问题描述:打包构建之后引入的外部 js失效,构建之后的 .nuxt 文件夹下的js文件中,引入 js 的script标签凭空消失!

    首先先说我遇到的问题描述 我是用vue nuxt项目 项目中使用了阿里播放器 于是我在vue页面中直接引入了阿里播放器的 css和js文件 然后运行没有任何问题 如下图所示 但是 当我打包以后 发现这个页面竟然报错 我打开 打包好的 nux
  • Debugger problem "The breakpoint will not currently be hit. No symbols have been loaded for this doc...

    网上收集到的相关解决办法 1st Start debugging Now select Debug gt Windows gt Modules In the modules window taht now appears check wha
  • 解决Windows缺少d3dcompiler_37.dll文件

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个d3dcompiler 37 dll文件进行安装
  • VSCode选择远程服务器的虚拟环境

    方式一 选择服务器虚拟环境conda Ctrl Shift P 选择需要使用的虚拟环境即可 方式二 选择Terminal 点击 通过命令行切换即可 参考 Work on Python in VSCode remotely over ssh
  • 不就是G2O嘛

    从零开始一起学习SLAM 理解图优化 一步步带你看懂g2o代码 SLAM的后端一般分为两种处理方法 一种是以扩展卡尔曼滤波 EKF 为代表的滤波方法 一种是以图优化为代表的非线性优化方法 不过 目前SLAM研究的主流热点几乎都是基于图优化的
  • jmeter压测实战包括cpu性能检测

    1 录制测试计划 1 打开jmeter 创建测试计划 线程组 sampler HTTP请求 监听器 查看结果树 聚合报告 2 服务器参数端口做了个参数化管理 3 对于请求数据也做一个参数化管理 4 最后运用参数化思想传参 HTTP请求 填写
  • Java程序设计——注解(Java高级应用)

    目录 一 基本注解 1 Override注解 2 Deprecated注解 3 SuppressWarnings注解 4 SafeVarargs注解 5 FunctionalInterface注解 二 定义注解 三 使用注解 四 元注解 1