Java中的注解和反射

2023-11-07

文章目录

Java中的注解和反射

一、注解

在Java中,注解不是必须的,但程序是需要一定的注解的,所以我们常常会使用到一些注解。注解在Java中的符号为Annotation。

1.1注解Annotation的作用

注解Annotation不是程序本身,可以对程序作出解释,这一点和注释(comment)没什么区别。
可以被其他程序(比如编译器等)读取。

1.2注解Annotation的格式

注解是以**“@注释名”**在代码中存在的,还可以添加一些参数值,例如:
@SuppressWarnings(value=“unchecked”)。

1.3注解Annotation在哪里使用

我们可以在附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们还可以通过反射机制编程实现对这些元数据的访问。

1.4实例

//@Override 重写的注解
@Override
public String toString(){
        return super.toString();
 }

二、内置注解

@Override:定义在java.lang.Override中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明。

@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。

@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好的了,我们选择性使用就好了;
@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})
等等…

代码实例:

@SuppressWarnings("all")
public void text(){
     List list = new ArrayList();
}

三、元注解

元注解的作用就是负责注解其他注解,Java定义了四个标准的meta-annotation类型,它们被用来提供对其他annotation类型做说明。

这些类型和他们所支持的类在java.lang.annotation包中可以找到。(@Target,@Retention,@Documented,@Inherited)
@Target:用于描述注解的使用范围,即被描述的注解可以用在什么地方。

@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)

@Documented:说明该注解将被包含在javadoc中。

@Inherited:说明子类可以继承父类中的该注解。

代码实例:

//@Target 表示我们的注解可以用在什么地方
@Target(value = {ElemenType.METHOD,ElementType.Type})

//@Retention 表示我们的注解在什么地方还有效
@Retention(value = RetentionPolicy.RUNTIME)

四、自定义注解

1.使用自定义注解@interface时,自动继承了java.lang.annotation.Annotation的接口。

2.@interface用来声明一个注解,格式为:public@ interface 注解名{定义内容}

3.其中的每一个方法,实际上是声明了一个配置参数

4.方法的名称就是参数的名称

5.返回值类型就是参数的类型,返回值只能是基本类型,如Class,String,enum

6.可以通过default来声明参数的默认值

7.如果只有一个参数成员,一般参数名为value

8.注解元素必须要有值,我们定义注解元素时经常使用空字符串,0作为默认值

代码实例:

@interface MyAnnotation{
            //注解的参数:参数类型+参数名();
            String name() default "";
            int age();
            int id(default -1;// 如果默认值为-1,表示不存在
             
             String[] schools() default{"",""};
       }

五、静态和动态语言

5.1动态语言

1.是一类在运行时可以改变其结构的语言。例如新的函数,对象,甚至代码可以被引进,已有的函数可以被删除或者是其他结构上的变化,通俗点说就是在运行时代码可以根据某些条件改变自身结构。
2.主要的动态语言有:Object-C、C#、JavaScript、PHP、Python等等。

5.2静态语言

1.与动态语言相对应的运行时结构不可变的语言就是静态语言,如Java、C、C++。
2.Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性。

六、Java Reflection

1.Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部消息,并能直接操作任意对象的内部属性及方法。
Class c = Class.forName(“java.lang.String”)

2.加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过对这个对象看到的类的结构,这个对象就像一面镜子,透过这个镜子看到类的结构,所以我们形象称之为:反射

正常方式:引入需要的“包类”的名称——>通过new实例化——>取得实例化的对象
反射方式:实例化对象——>getClass()方法——>得到完整的“包类”名称

七、Java反射机制提供的功能

7.1Java反射机制的功能

1.在运行时判断任意一个对象所属的类
2.在预习时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时获取泛型类信息
5.在运行时调用任意一个对象的成员变量和方法
6.在运行时处理注解
7.生成动态代理
8.等等…

7.2Java反射机制的优点和缺点

优点是可以实现动态创建对象和边一体现出很大的灵活性;

缺点是对性能有影响,使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且让它满足我们的要求,这类操作总是慢于直接执行相同的操作。

7.3代码实例

//通过反射获取类的class对象
Class c1 = Class.forName("com.deng.reflection.user");
System.out.println(c1);

Class c2 = Class.forName("com.deng.reflection.user");
Class c3 = Class.forName("com.deng.reflection.user");
//一个类在内存中只有一个class对象
//一个类被加载后,类的整个结构都会被封装在Class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());

八、Class类

8.1Class类的定义

在Object类中定义了以下方法,此方法将被所有子类继承
public final Class getClass()

以上方法返回值类型是一个Class类,此类是Java反射的源头,实际上所谓的反射从程序运行结果来看也很好理解,即通过对象反射求出类的名称

8.2Class类的解释

对象照镜子后可以得到的信息:某个类的属性,方法和构造器,某个类到底实现了哪些接口,对于每个类而言,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了特定的某个结构有关的信息。

1.Class本身也是一个类
2.Class对象只能由系统建立对象
3.一个加载的类在JVM中只会有一个Class实例
4.一个Class对象对应的是一个加载到JVM中的一个.class文件
5.每个类的实力都会记得自己是有哪个Class实例所生成的
6.通过Class可以完整的得到一个类中的所有被加载的结构
7.Class类是Reflection的根源,针对任何理想动态加载、运行的类,唯有先获得相应的Class对象

8.3Class类的常用方法

static ClassforName(String name)  //返回指定类名name的Class对象

Object newInstance  //调用缺省构造函数,返回Class对象的一个实例

getName()  //返回此Class对象所表示的实体(类接口数组类或者void)的名称

Class getSuperClass()  //返回当前Class对象的父类Class对象

Class[] getinterfaces()  //获取当前Class对象的接口

ClassLoader getClassLoader()  //返回该类的类加载器

Constructor[] getConstructors()  //返回一个包含某些Constructor对象的数组

Method getMothed(String name,Class..)  //返回一个Method对象,此对象形参类型为param Type

Field[] getDeclaredFields()  //返回Field对象的一个数字

8.4Class类的实例

1.若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

  Class clazz = Person.class;

2.已知某个类的实例,调用该实例的getClass()方法获取Class对象

Class clazz = person.getClass();

3.已知一个类的全类名,且该类在内的路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

Class clazz = Class.forName("demo01.Student");

4.内置基本数据类型可以直接用类名.Type
5.还可以利用ClassLoader

九、可以有Class的对象的类型

实例:

//所有类型的Class
 public static void main (String[] args){
      Class c1 = Object.class;    //类
      Class c2 = Comparable.class;    //接口
      Class c3 = String[].class;   //一维数组
      Class c4 = int[][].class;   //二维数组
      Class c5 = Override.class;   //注解
      Class c6 = ElementType.class;    //枚举
      Class c7 = Integer.class;  //基本数据类型
      Class c8 = void.class;   //void
      Class c9 = Class.class;   //Class
  }

注意:

//只要元素类型与维度一样,就是同一个Class
int[] a = new int[10];
int[] b = new int[100];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());

十、Java内存

在Java中,内存分为堆,栈和方法区。
堆:
就是可以存放new的对象和数组,也可以被所有线程共享,不会存放别的对象引用。
栈:
就是存放基本变量类型(会包含这个基本类型的具体数值);
引用对象变量(会存放这个引用在堆里面的具体地址)。
方法区:
可以被所有线程共享;
包含了所有的class和static变量。

十一、类加载器与ClassLoader

加载:
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象。

链接:
将JAVA类的二进制代码合并到JVM的运行状态之中的过程。
1.验证确保加载的类的信息符合JVM规范,没有安全方面的问题;
2.准备正式为类的变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配;
3.解析虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

初始化:
1.执行类构造器()方法的过程,类构造器()方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的(类构造器是构造类信息的,不是构造该类对象的构造器);
2.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化;
3.虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。

十二、发生类初始化的时候

类主动引用(一定会发生类的初始化)
1.当虚拟机启动,先初始化main方法所在的类;
2.new一个类的对象;
3.调用类的静态成员(除了final常量)和静态方法;
4.使用java.lang.reflect包的方法对内进行反射调用;
5.当初始化一个类,如果其父类没有被初始化,则会先初始化他的父类。

类的被动引用(不会发生类的初始化)
1.当访问一个静态域时,只有真正声明这个域的类才会被初始化,如当通过子类引用父类的静态变量,不会导致子类初始化;
2.通过数组定义类的应用,不会触发此类的初始化;
3.引用常量不会触发子类的初始化(常量在链接阶段就存入调用类的常量池中了)。

十三、类加载器的作用

类加载器作用是用来把内装载进内存的,JVM规范定义了如下类型的类加载器。

13.1引导类加载器

用C++编写的,是j VAN自带的类加载器,负责JAVA平台核心库,用来装载核心类库,该加载器无法直接获取。
实例为:

//获取扩展类加载器的父类加载器--->根加载器(C/C++)
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);

13.2扩展类加载器

扩展类加载器负责jre/lib/ext目录下的jar包或D java.ext.dirs指定目录下的jar包装入工作库。
实例为:

//获取系统类加载器的父类加载器--->扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);

13.3系统类加载器

系统类加载器负责java-classpath或-D java.class.path所指的目录下的类与jar包装入工作,是最常用的加载器。
实例为:

//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);

十四、获取运行时类的完整结构

通过反射获取运行时类的完整结构
Field、Method、Constructor、Superclass、Interface、Annotation
可以实现全部接口;
所继承的父类;
全部的构造器;
全部的方法;
全部的Field;
注解;等等

十五、调用指定的方法

通过反射调用类中的方法,通过Method类完成。
1.通过Class类的getMethod(Strong name,Class…parameter Types)方法取得一个Method对象,并设置此方法操作时所需要的参数类型;
2.之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。

Object invoke(Object obj,Object[] args)
Object对应原方法的返回值,若原方法无返回值,此时返回null;
若原方法为静态方法,此时形参Object obj可为null;
若原方法形参列表为空,则Object[] args 为null;
若原方法声明为private,则需要在调用此invoke()方法前,显示调用方法对象的setAccessible(true)方法,则可访问private的方法;

十六、setAccessible

1.Method和Field、Constructor对象都有setAccessible()方法;
2.setAccessible()作用是启动和禁用访问安全检查的开关;
3.参数值为true则只是反射的对象,在使用时应该取消JAVA语言访问的检查
能提高反射的效率,如果代码中必须用反射,则该代码需要频繁的被调 用,那么请设置为true;
使原本无法访问的私有成员也可以访问。
4.参数值为false则指示反射的对象应该实施JAVA语言进行访问检查。

十七、反射操作泛型

JAVA采用泛型擦除的机制来引入泛型,JAVA中的泛型仅仅是给编译器使用的,确保数据的安全性和免去强制类型转换的问题,但是一旦编译完成,所有和泛型有关的类型全部擦除。

为了通过反射操作这些类型,JAVA新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType,几种类型来代表不能被归一到Class类中的类型,但是又和原始类型齐名的类型。

ParameterizedType表示一种参数化类型,比如Collection;
GenericArrayType表示一种元素类型是参数化类型或者类型变量的数组类型;
TypeVariable是各种类型变量的公共父接口;
WildcardType代表一种通配符类型表达式。

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

Java中的注解和反射 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • Unity上架苹果商店游戏资源加载的问题被拒4.2.3

    由于游戏资源加载的问题被4 2 3拒绝的解决方案 方案一 加一个下载资源说明 然后改一下逻辑 启动app可以正常进去 然后提醒用户在你进去体验的初期 我们会继续在Wi Fi环境下继续下载app需要的资源 方案二 真是本地解压资源 可以搞一个
  • 前端笔记目录

    HTML 部分 HTML 常用的标签 HTML 表格标签 HTML 列表标签 HTML 表单标签 CSS 部分 CSS 选择器 CSS 字体属性 JavaScript 部分 JavaScript ES6新特性 1 JavaScript ES
  • 简单的spring项目搭建流程

    一 搭建步骤 创建空maven项目 pom文件导入相应依赖jar包 创建包结构 domain test即可 创建JavaBean配置文件 编写简单示例 二 开始 1 创建一个空的maven项目 2 在pom xml文件中导入spring5依
  • AI小程序——文本绘图

    文章目录 一 摘要 二 文心 ERNIE ViLG 技术原理解读 图文双向生成统一建模 三 使用教程 2 1 exe下载 2 2 获取API 2 3 软件使用 2 4 源码链接 一 摘要 在文字生成图像上 文心 ERNIE ViLG 可以根
  • 力扣第99场双周赛题目记录(复盘)

    第一题 2578 最小和分割 给你一个正整数 num 请你将它分割成两个非负整数 num1 和 num2 满足 num1 和 num2 直接连起来 得到 num 各数位的一个排列 换句话说 num1 和 num2 中所有数字出现的次数之和等
  • 解决 VMware 克隆或复制的虚拟机,同时只有一台能上网问题

    VMware 克隆或复制虚拟机后 发现不能上网 多次调试后 确定是克隆或复制的虚拟机与原虚拟机 同时只能有一台能上网 原因是 克隆或复制的虚拟机 网卡 MAC 地址一样导致 重新分配的新 MAC 地址即可 方法如下 1 打开 Vmware
  • Matlab/Simulink-单相逆变电路双闭环仿真搭建

    1 前言 Simulink零基础 单相逆变电路双闭环仿真搭建 单相逆变电路仿真 单相逆变仿真 十分钟让你掌握单相电路简单的双闭环控制 本文不讲单相逆变电路的原理和构成 只涉及如何在Simulink中实现单相逆变电路 搭建的过程在下面视频里了
  • Unity射线穿透UI解决

    unity场景中 射线是可以穿透UI的 我用过很多版本 都有这个问题 比如我现在用2020版本的unity做了个范例 我在场景中新建了一个cube名叫 我秦始皇打钱 点击这个物体就会出现log显示这个物体的名字 代码在下面 运行之后确实会弹
  • 计算机原码补码和反码的计算方法,一个数的原码,反码,补码怎么算,原码 反码 补码...

    数在计算机中是以二进制形式表示的 数分为有符号数和无符号数 原码 反码 补码都是有符号定点数的表示方法 一个有符号定点数的最高位为符号位 0是正 1是副 以下都以8位整数为例 原码就是这个数本身的二进制形式 例如 0000001 就是 1
  • Vue3+ts+element-plus 组件的二次封装-- 头部搜索条件的封装

    Vue 常用笔记 本人是一个web前端开发工程师 主要是vue框架 整理了一些Vue常用的技术 一方面是分享 一方面是做总结 今后也会一直更新 有好建议的同学欢迎评论区分享 Vue专栏 点击此处 Vue组件库专栏 点击此处 Vue2 vs
  • Unity中同时修改物体及其所有子物体层级

    简单说一下思路 首先你得判定当前物体是否有子物体 没有的话就直接设置层级 有的话就再回到1 继续判断子物体下是否还有子物体 接下来结合代码再好好理解一下 private void ChangeLayer Transform transfor
  • matlab实现牛顿下山法

    说起牛顿下山法 首先要提牛顿法 牛顿法是求解非线性方程的一个重要方法 具体可以点击牛顿法 虽然牛顿法作为一个二阶的迭代收敛方法 但是其对于函数和初始点的要求都比较高 而牛顿下山法则是有效降低这些要求的一种技巧 牛顿下山法的迭代公式如下 x
  • [C/C++] 创建后台接受命令程序

    C C 多线程时 运行时输入自定义参数 达到控制线程的目的 基础概念 线程 线程是操作系统能够进行运算调度的最小单位 它被包含在进程之中 进程包含一个或者多个线程 进程可以理解为完成一件事的完整解决方案 而线程可以理解为这个解决方案中的的一
  • 弹性布局-更优秀的Flex

    Flex布局详解 浮动布局的优缺点 图文的环绕显示 浮动元素 同行显示 适配性更好 忘记清浮动 高度坍塌 flex布局的优缺点 IE10以下不支持 用来做布局的 很方便 flex布局 flex flexible 弹性布局 移动端用的最多 P
  • LeetCode——345. 反转字符串中的元音字母

    反转字符串中的元音字母 题目 思路 代码 结果 题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 思路 没有什么难度 很简单的数组判断交换 代码 clas
  • 操作系统——启动操作系统及ucore-lab0 coding

    花了一周多时间把操作系统的课程看了一遍 晚上结课的时候尝试性地想看着笔记的标题回忆一下内容 发现 嗯 一片混沌 趁热打铁做个总结吧 辅以uCoreLab上的coding 一个走 1 操作系统的启动 未启动前 os和Bootloader都存放
  • 图形学/OpenGL/3D数学/Unity

    1 场景管理的数据结构 总结 游戏开发最常用的空间数据结构是四叉 八叉树和BVH树 而BSP树基本上只能应用于编辑器上 k d树则只能用在特殊问题应用场景 2 帧同步与状态同步 https gameinstitute qq com comm
  • lattice 包中的直方图绘制

    1 直方图 library lattice install packages nutshell library nutshell histogram DBWT DPLURAL data births2006 smpl main births
  • 记一次Swagger页面报错/error 404的排查过程

    记一次Swagger页面报错 error 404的排查过程 使用springfox swagger ui展示的页面如下 Maven引用 使用springfox swagger ui展示的页面如下 说是没有为 error这个路径指明确定的映射
  • Java中的注解和反射

    文章目录 Java中的注解和反射 一 注解 1 1注解Annotation的作用 1 2注解Annotation的格式 1 3注解Annotation在哪里使用 1 4实例 二 内置注解 三 元注解 四 自定义注解 五 静态和动态语言 5