摘要
Java Annotation是JDK5.0引入的一种注释机制。
网上很多关于Java Annotation的文章,看得人眼花缭乱。Java Annotation本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。
我按照自己的思路,对Annotation进行了整理。理解 Annotation 的关键,是理解Annotation的语法和用法,对这些内容,我都进行了详细说明;理解Annotation的语法和用法之后,再看Annotation的框架图,可能有更深刻体会。废话就说这么多,下面开始对Annotation进行说明。若您发现文章中存在错误或不足的地方,希望您能指出!
第1部分 Annotation架构
先看看Annotation的架构图:
从中,我们可以看出:
(01) 1个Annotation 和 1个RetentionPolicy关联。
可以理解为:每1个Annotation对象,都会有唯一的RetentionPolicy属性。
(02) 1个Annotation 和 1~n个ElementType关联。
可以理解为:对于每1个Annotation对象,可以有若干个ElementType属性。
(03) Annotation 有许多实现类,包括:Deprecated, Documented, Inherited, Override等等。
Annotation 的每一个实现类,都“和1个RetentionPolicy关联”并且“和1~n个ElementType关联”。
下面,我先介绍框架图的左半边(如下图),即Annotation, RetentionPolicy, ElementType;然后在就Annotation的实现类进行举例说明。
第2部分 Annotation组成部分
1 annotation组成成分
java annotation 的组成中,有3个非常重要的主干类。它们分别是:
(01) Annotation.java
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); }
(02) ElementType.java
package java.lang.annotation; public enum ElementType { TYPE, /* 类、接口(包括注释类型)或枚举声明 */ FIELD, /* 字段声明(包括枚举常量) */ METHOD, /* 方法声明 */ PARAMETER, /* 参数声明 */ CONSTRUCTOR, /* 构造方法声明 */ LOCAL_VARIABLE, /* 局部变量声明 */ ANNOTATION_TYPE, /* 注释类型声明 */ PACKAGE /* 包声明 */ }
(03) RetentionPolicy.java
package java.lang.annotation; public enum RetentionPolicy { SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */ CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */ RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */ }
说明:
(01) Annotation 就是个接口。
“每1个Annotation” 都与 “1个RetentionPolicy”关联,并且与 “1~n个ElementType”关联。可以通俗的理解为:每1个Annotation对象,都会有唯一的RetentionPolicy属性;至于ElementType属性,则有1~n个。
(02) ElementType 是Enum枚举类型,它用来指定Annotation的类型。
“每1个Annotation” 都与 “1~n个ElementType”关联。当Annotation与某个ElementType关联时,就意味着:Annotation有了某种用途。
例如,若一个Annotation对象是METHOD类型,则该Annotation只能用来修饰方法。
(03) RetentionPolicy 是Enum枚举类型,它用来指定Annotation的策略。通俗点说,就是不同RetentionPolicy类型的Annotation的作用域不同。
“每1个Annotation” 都与 “1个RetentionPolicy”关联。
a) 若Annotation的类型为 SOURCE,则意味着:Annotation仅存在于编译器处理期间,编译器处理完之后,该Annotation就没用了。
例如,“ @Override ”标志就是一个Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,“@Override”就没有任何作用了。
b) 若Annotation的类型为 CLASS,则意味着:编译器将Annotation存储于类对应的.class文件中,它是Annotation的默认行为。
c) 若Annotation的类型为 RUNTIME,则意味着:编译器将Annotation存储于class文件中,并且可由JVM读入。
这时,只需要记住“每1个Annotation” 都与 “1个RetentionPolicy”关联,并且与 “1~n个ElementType”关联。学完后面的内容之后,再回头看这些内容,会更容易理解。
第3部分 java自带的Annotation
理解了上面的3个类的作用之后,我们接下来可以讲解Annotation实现类的语法定义了。
1 Annotation通用定义
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation1 { }
说明:
上面的作用是定义一个Annotation,它的名字是MyAnnotation1。定义了MyAnnotation1之后,我们可以在代码中通过“@MyAnnotation1”来使用它。
其它的,@Documented, @Target, @Retention, @interface都是来修饰MyAnnotation1的。下面分别说说它们的含义:
(01) @interface
使用@interface定义注解时,意味着它实现了java.lang.annotation.Annotation接口,即该注解就是一个Annotation。
定义Annotation时,@interface是必须的。
注意:它和我们通常的implemented实现接口的方法不同。Annotation接口的实现细节都由编译器完成。通过@interface定义注解后,该注解不能继承其他的注解或接口。
(02) @Documented
类和方法的Annotation在缺省情况下是不出现在javadoc中的。如果使用@Documented修饰该Annotation,则表示它可以出现在javadoc中。
定义Annotation时,@Documented可有可无;若没有定义,则Annotation不会出现在javadoc中。
(03) @Target(ElementType.TYPE)
前面我们说过,ElementType 是Annotation的类型属性。而@Target的作用,就是来指定Annotation的类型属性。
@Target(ElementType.TYPE) 的意思就是指定该Annotation的类型是ElementType.TYPE。这就意味着,MyAnnotation1是来修饰“类、接口(包括注释类型)或枚举声明”的注解。
定义Annotation时,@Target可有可无。若有@Target,则该Annotation只能用于它所指定的地方;若没有@Target,则该Annotation可以用于任何地方。
(04) @Retention(RetentionPolicy.RUNTIME)
前面我们说过,RetentionPolicy 是Annotation的策略属性,而@Retention的作用,就是指定Annotation的策略属性。
@Retention(RetentionPolicy.RUNTIME) 的意思就是指定该Annotation的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将该Annotation信息保留在.class文件中,并且能被虚拟机读取。
定义Annotation时,@Retention可有可无。若没有@Retention,则默认是RetentionPolicy.CLASS。
2 java自带的Annotation
通过上面的示例,我们能理解:@interface用来声明Annotation,@Documented用来表示该Annotation是否会出现在javadoc中, @Target用来指定Annotation的类型,@Retention用来指定Annotation的策略。
理解这一点之后,我们就很容易理解java中自带的Annotation的实现类,即Annotation架构图的右半边。如下图:
java 常用的Annotation:
@Deprecated -- @Deprecated 所标注内容,不再被建议使用。
@Override -- @Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented -- @Documented 所标注内容,可以出现在javadoc中。
@Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
@Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
@Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
@SuppressWarnings -- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
由于“@Deprecated和@Override”类似,“@Documented, @Inherited, @Retention, @Target”类似;下面,我们只对@Deprecated, @Inherited, @SuppressWarnings 这3个Annotation进行说明。
2.1 @Deprecated
@Deprecated 的定义如下:
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface Deprecated { }
说明:
(01) @interface -- 它的用来修饰Deprecated,意味着Deprecated实现了java.lang.annotation.Annotation接口;即Deprecated就是一个注解。
(02) @Documented -- 它的作用是说明该注解能出现在javadoc中。
(03) @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定Deprecated的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将Deprecated的信息保留在.class文件中,并且能被虚拟机读取。
(04) @Deprecated 所标注内容,不再被建议使用。
例如,若某个方法被 @Deprecated 标注,则该方法不再被建议使用。如果有开发人员试图使用或重写被@Deprecated标示的方法,编译器会给相应的提示信息。示例如下:
源码如下(DeprecatedTest.java):

说明:
上面是eclipse中的截图,比较类中 “getString1() 和 getString2()” 以及 “testDate() 和 testCalendar()” 。
(01) getString1() 被@Deprecated标注,意味着建议不再使用getString1();所以getString1()的定义和调用时,都会一横线。这一横线是eclipse()对@Deprecated方法的处理。
getString2() 没有被@Deprecated标注,它的显示正常。
(02) testDate() 调用了Date的相关方法,而java已经建议不再使用Date操作日期/时间。因此,在调用Date的API时,会产生警告信息,途中的warnings。
testCalendar() 调用了Calendar的API来操作日期/时间,java建议用Calendar取代Date。因此,操作Calendar不回产生warning。
2.2 @Inherited
@Inherited 的定义如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
说明:
(01) @interface -- 它的用来修饰Inherited,意味着Inherited实现了java.lang.annotation.Annotation接口;即Inherited就是一个注解。
(02) @Documented -- 它的作用是说明该注解能出现在javadoc中。
(03) @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定Inherited的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将Inherited的信息保留在.class文件中,并且能被虚拟机读取。
(04) @Target(ElementType.ANNOTATION_TYPE) -- 它的作用是指定Inherited的类型是ANNOTATION_TYPE。这就意味着,@Inherited只能被用来标注“Annotation类型”。
(05) @Inherited 的含义是,它所标注的Annotation将具有继承性。
假设,我们定义了某个Annotaion,它的名称是MyAnnotation,并且MyAnnotation被标注为@Inherited。现在,某个类Base使用了MyAnnotation,则Base具有了“具有了注解MyAnnotation”;现在,Sub继承了Base,由于MyAnnotation是@Inherited的(具有继承性),所以,Sub也“具有了注解MyAnnotation”。
@Inherited的使用示例
源码如下(InheritableSon.java):
1 /** 2 * @Inherited 演示示例 3 * 4 * @author skywang 5 * @email kuiwu-wang@163.com 6 */ 7 package com.skywang.annotation; 8 9 import java.lang.annotation.Target; 10 import java.lang.annotation.ElementType; 11 import java.lang.annotation.Retention; 12 import java.lang.annotation.RetentionPolicy; 13 import java.lang.annotation.Inherited; 14 15 /** 16 * 自定义的Annotation。 17 */ 18 @Target(ElementType.TYPE) 19 @Retention(RetentionPolicy.RUNTIME) 20 @Inherited 21 @interface Inheritable 22 { 23 } 24 25 @Inheritable 26 class InheritableFather 27 { 28 public InheritableFather() { 29 // InheritableBase是否具有 Inheritable Annotation 30 System.out.println("InheritableFather:"+InheritableFather.class.isAnnotationPresent(Inheritable.class)); 31 } 32 } 33 34 /** 35 * InheritableSon 类只是继承于 InheritableFather, 36 */ 37 public class InheritableSon extends InheritableFather 38 { 39 public InheritableSon() { 40 super(); // 调用父类的构造函数 41 // InheritableSon类是否具有 Inheritable Annotation 42 System.out.println("InheritableSon:"+InheritableSon.class.isAnnotationPresent(Inheritable.class)); 43 } 44 45 public static void main(String[] args) 46 { 47 InheritableSon is = new InheritableSon(); 48 } 49 }
运行结果:
InheritableFather:true
InheritableSon:true
现在,我们对InheritableSon.java进行修改:注释掉“Inheritable的@Inherited注解”。
源码如下(InheritableSon.java):

运行结果:
InheritableFather:true
InheritableSon:false
对比上面的两个结果,我们发现:当注解Inheritable被@Inherited标注时,它具有继承性。否则,没有继承性。
2.3 @SuppressWarnings
@SuppressWarnings 的定义如下:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
说明:
(01) @interface -- 它的用来修饰SuppressWarnings,意味着SuppressWarnings实现了java.lang.annotation.Annotation接口;即SuppressWarnings就是一个注解。
(02) @Retention(RetentionPolicy.SOURCE) -- 它的作用是指定SuppressWarnings的策略是RetentionPolicy.SOURCE。这就意味着,SuppressWarnings信息仅存在于编译器处理期间,编译器处理完之后SuppressWarnings就没有作用了。
(03) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -- 它的作用是指定SuppressWarnings的类型同时包括TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
TYPE意味着,它能标注“类、接口(包括注释类型)或枚举声明”。
FIELD意味着,它能标注“字段声明”。
METHOD意味着,它能标注“方法”。
PARAMETER意味着,它能标注“参数”。
CONSTRUCTOR意味着,它能标注“构造方法”。
LOCAL_VARIABLE意味着,它能标注“局部变量”。
(04) String[] value(); 意味着,SuppressWarnings能指定参数
(05) SuppressWarnings 的作用是,让编译器对“它所标注的内容”的某些警告保持静默。例如,"@SuppressWarnings(value={"deprecation", "unchecked"})" 表示对“它所标注的内容”中的 “SuppressWarnings不再建议使用警告”和“未检查的转换时的警告”保持沉默。示例如下:
源码如下(SuppressWarningTest.java):

说明:
(01) 左边的图中,没有使用 @SuppressWarnings(value={"deprecation"}) , 而Date属于java不再建议使用的类。因此,调用Date的API时,会产生警告。
而右边的途中,使用了 @SuppressWarnings(value={"deprecation"})。因此,编译器对“调用Date的API产生的警告”保持沉默。
补充:SuppressWarnings 常用的关键字的表格
deprecation -- 使用了不赞成使用的类或方法时的警告
unchecked -- 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。
fallthrough -- 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。
path -- 在类路径、源文件路径等中有不存在的路径时的警告。
serial -- 当在可序列化的类上缺少 serialVersionUID 定义时的警告。
finally -- 任何 finally 子句不能正常完成时的警告。
all -- 关于以上所有情况的警告。
第4部分 Annotation 的作用
Annotation 是一个辅助类,它在Junit、Struts、Spring等工具框架中被广泛使用。
我们在编程中经常会使用到的Annotation作用有:
1 编译检查
Annotation具有“让编译器进行编译检查的作用”。
例如,@SuppressWarnings, @Deprecated和@Override都具有编译检查作用。
(01) 关于@SuppressWarnings和@Deprecated,已经在“第3部分”中详细介绍过了。这里就不再举例说明了。
(02) 若某个方法被 @Override的 标注,则意味着该方法会覆盖父类中的同名方法。如果有方法被@Override标示,但父类中却没有“被@Override标注”的同名方法,则编译器会报错。示例如下:
源码(OverrideTest.java):

上面是该程序在eclipse中的截图。从中,我们可以发现“getString()”函数会报错。这是因为“getString() 被@Override所标注,但在OverrideTest的任何父类中都没有定义getString1()函数”。
“将getString() 上面的@Override注释掉”,即可解决该错误。
2 在反射中使用Annotation
在反射的Class, Method, Field等函数中,有许多于Annotation相关的接口。
这也意味着,我们可以在反射中解析并使用Annotation。
源码如下(AnnotationTest.java):
package com.skywang.annotation; import java.lang.annotation.Annotation; import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Inherited; import java.lang.reflect.Method; /** * Annotation在反射函数中的使用示例 * * @author skywang * @email kuiwu-wang@163.com */ @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { String[] value() default "unknown"; } /** * Person类。它会使用MyAnnotation注解。 */ class Person { /** * empty()方法同时被 "@Deprecated" 和 “@MyAnnotation(value={"a","b"})”所标注 * (01) @Deprecated,意味着empty()方法,不再被建议使用 * (02) @MyAnnotation, 意味着empty() 方法对应的MyAnnotation的value值是默认值"unknown" */ @MyAnnotation @Deprecated public void empty(){ System.out.println("\nempty"); } /** * sombody() 被 @MyAnnotation(value={"girl","boy"}) 所标注, * @MyAnnotation(value={"girl","boy"}), 意味着MyAnnotation的value值是{"girl","boy"} */ @MyAnnotation(value={"girl","boy"}) public void somebody(String name, int age){ System.out.println("\nsomebody: "+name+", "+age); } } public class AnnotationTest { public static void main(String[] args) throws Exception { // 新建Person Person person = new Person(); // 获取Person的Class实例 Class<Person> c = Person.class; // 获取 somebody() 方法的Method实例 Method mSomebody = c.getMethod("somebody", new Class[]{String.class, int.class}); // 执行该方法 mSomebody.invoke(person, new Object[]{"lily", 18}); iteratorAnnotations(mSomebody); // 获取 somebody() 方法的Method实例 Method mEmpty = c.getMethod("empty", new Class[]{}); // 执行该方法 mEmpty.invoke(person, new Object[]{}); iteratorAnnotations(mEmpty); } public static void iteratorAnnotations(Method method) { // 判断 somebody() 方法是否包含MyAnnotation注解 if(method.isAnnotationPresent(MyAnnotation.class)){ // 获取该方法的MyAnnotation注解实例 MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class); // 获取 myAnnotation的值,并打印出来 String[] values = myAnnotation.value(); for (String str:values) System.out.printf(str+", "); System.out.println(); } // 获取方法上的所有注解,并打印出来 Annotation[] annotations = method.getAnnotations(); for(Annotation annotation : annotations){ System.out.println(annotation); } } }
运行结果:
somebody: lily, 18
girl, boy,
@com.skywang.annotation.MyAnnotation(value=[girl, boy])
empty
unknown,
@com.skywang.annotation.MyAnnotation(value=[unknown])
@java.lang.Deprecated()
3 根据Annotation生成帮助文档
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。
4 能够帮忙查看查看代码
通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构。
另外,我们也可以通过自定义Annotation来实现一些功能。
相关推荐
本文将详细介绍Java Annotation的基本概念、语法和用法,以及它们的框架结构。 首先,了解Annotation的架构至关重要。一个Annotation与一个RetentionPolicy相关联,这意味着每个Annotation实例都有一个特定的保留...
在"2016-Java教学资料_wzf"这个压缩包中,很可能是包含了上述各个方面的详细教程和实例代码。通过阅读和实践这些材料,初学者可以逐步建立起对Java编程的系统认知,提高编程能力。同时,自我学习的过程中,建议结合...
内容概要:本文详细探讨了无人机轨迹规划中的内外安全策略。外部安全主要依靠RRT(快速扩展随机树)算法,在未知环境中随机探索路径,避免障碍物。内部安全则关注无人机电机的工作状态,通过序列二次规划(SQP)优化轨迹,确保电机推力在合理范围内,避免过载。两者结合,形成了一种高效的无人机轨迹规划方法。文中还提供了具体的Matlab代码实现,展示了如何将这两种安全策略融合在一起,以提高无人机的安全性和能效。 适合人群:从事无人机研究、开发的技术人员,尤其是对轨迹规划感兴趣的工程师。 使用场景及目标:适用于需要在复杂环境中进行高效、安全飞行的无人机项目。目标是通过合理的算法设计,使无人机能够在避开障碍物的同时,保持电机在最佳工作状态,从而延长电池寿命,降低故障率。 其他说明:文中提到的实际案例和实验数据进一步验证了所提出方法的有效性。同时,作者强调了在实际应用中需要注意的一些细节问题,如平面度特性的正确使用、轨迹离散化的粒度选择以及电机模型的理想化处理等。
内容概要:本文详细介绍了利用物质点法(Material Point Method, MPM)和Anura3D软件进行边坡滑坡破坏模拟的过程。文章首先解释了MPM的基本原理,即通过物质点跟踪材料属性并结合欧拉网格进行计算,适用于大变形和破坏问题。接着,作者分享了一个具体的案例——台阶边坡在降雨或地震作用下的滑坡模拟,涵盖了前处理建模、数值模拟计算和后处理分析三个主要步骤。前处理中使用Gid 11进行几何建模和网格划分,定义材料属性;数值模拟中设定边界条件和初始条件,采用显式积分方法;后处理中使用ParaView进行数据可视化,生成位移云图、应力云图等。此外,还讨论了一些常见问题和技术细节,如接触算法、时间步长的选择等。 适合人群:对数值模拟特别是物质点法感兴趣的地质工程研究人员、岩土工程师及相关领域的学生。 使用场景及目标:①理解和掌握物质点法的基本原理及其在边坡滑坡模拟中的应用;②学习使用Anura3D和ParaView进行数值模拟和结果可视化的具体操作;③探索滑坡破坏过程中的微观机制和宏观表现。 阅读建议:本文不仅提供了详细的理论介绍和技术指导,还包括了许多实用的操作技巧和注意事项。建议读者在实践中逐步尝试文中提到的方法和参数设置,同时关注可能出现的问题及其解决方案。
Altium Designer 25.5.2 Build 35 (x64) ,不知道更新了什么,不好下载就先下载到雷盘再下载
基于ssm的大学生创新创业项目管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成学院、专业、班级管理,创新计划,项目管理等功能于一体的系统。 ## 功能介绍 - 学院管理:学院信息的增删改查,按名称模糊搜索查询,学院简介信息支持富文本编辑 - 专业管理:专业信息的增删改查,按名称模糊搜索,按学院选择查询 - 班级管理:班级信息的增删改查,,按名称模糊搜索,按学院、专业选择查询 - 用户管理:用户信息的增删改查,多条件搜索查询 - 创新计划:创新计划信息增删改查,详情信息支持富文本编辑,上传附件,查看申请 - 项目管理:项目列表查询,申请审核 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>
内容概要:本文详细介绍了FracPredictor这一基于深度学习的裂缝预测工具及其应用。首先探讨了数据处理部分,如利用滑窗处理时序+空间特征混合体的方法,以及如何将岩石力学数据转换为适合神经网络的格式。接着深入剖析了模型架构,包括时空双流网络、注意力机制用于跨模态融合、HybridResBlock自定义层等创新设计。此外,文章还分享了训练技巧,如渐进式学习率衰减、CosineAnnealingWarmRestarts调度器的应用。对于可视化方面,则推荐使用PyVista进行三维渲染,以直观展示裂缝扩展过程。文中还提到了一些实用的小技巧,如数据预处理中的自动标准化、配置文件参数调整、以及针对特定地质条件的优化措施。最后,通过多个实际案例展示了FracPredictor在提高预测准确性、降低计算成本方面的优势。 适合人群:从事石油工程、地质勘探领域的研究人员和技术人员,尤其是对裂缝建模与压裂模拟感兴趣的从业者。 使用场景及目标:适用于需要高效、精准地进行裂缝预测和压裂模拟的工程项目。主要目标是帮助用户掌握FracPredictor的工作原理,学会从数据准备到结果可视化的完整流程,从而优化压裂方案,减少工程风险。 其他说明:文章不仅提供了详细的代码示例,还附带了丰富的实战经验和注意事项,有助于读者更好地理解和应用这项新技术。
基于ssm的二手汽车销售管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis,角色分为经理和员工;集成品牌管理、客户管理、销售管理、库存管理、收购管理等功能于一体的系统。 ## 功能介绍 - 品牌管理:品牌信息的增删改查,热门品牌列表,销量比较好的顺序排行 - 客户管理:客户资料信息的增删改查 - 销售管理:车辆销售登记,列表查询,付款 - 库存管理:车辆库存情况查询,下订单 - 收购管理:收购评估,收购订单查询 - 统计管理:财务状况(柱状图),下载excel表格 - 员工管理:员工信息的增删改查,账号激活操作 - 聊天管理:聊天内容查看,指定人员发送聊天内容 ## 环境 - <b>IntelliJ IDEA 2009.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>
内容概要:本文详细介绍了改进的樽海鞘群算法(SSA)在光伏最大功率点跟踪(MPPT)中的应用。首先探讨了领导者更新机制的改进,引入反向学习思想,使算法能够更好地进行全局和局部搜索。其次,对追随者更新公式进行了优化,使其更倾向于适应度较高的个体,从而提高搜索效率。此外,增加了光照突变重启功能,确保算法在光照条件突变时仍能快速响应并重新定位最大功率点。通过仿真实验表明,改进后的算法显著提升了收敛速度和稳定性,尤其在光照突变情况下表现优异。 适合人群:从事光伏系统研究和技术开发的专业人士,尤其是对优化算法感兴趣的科研人员和工程师。 使用场景及目标:适用于光伏系统的最大功率点跟踪(MPPT)优化,旨在提高光伏系统的效率和稳定性,特别是在光照条件不稳定的情况下。 其他说明:文中提供了详细的代码示例和参数调优建议,有助于实际工程应用中的实施和调试。
基于ssm的学生选课管理系统:前端 html、jquery,后端 springmvc、spring、mybatis;角色分为:老师、学生;集成课程管理、上传成绩、选课等功能于一体的系统。 ## 功能介绍 - 基本功能:登录,注册,退出 - 我的课程:教师可以增加自己的课程供学生选择,可以查看当前课程有哪些学生选择 - 上传成绩:课程列表展示,双击课程可以进入该课程下面上传学生成绩 - 个人信息:个人信息查询与修改,密码修改 - 系统消息:系统消息列表查询 - 我的选课:选课信息查询,课程退选 - 网上选课:课程列表查询,关键词搜索,课程报名 - 往期课程:课程列表查询,导出成绩为word文档 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>
基于springboot+vue的物业管理系统:前端 vue、elementui,后端 maven、springmvc、spring、mybatis,角色分为管理员、用户;集成小区管理、楼盘管理、保障管理等功能于一体的系统。 ## 功能介绍 - 小区管理:小区基本信息查询与修改,周边设施增删改查,物业公告信息增删改查,支持模糊查询 - 楼宇管理:小区楼宇信息增删改查 - 房间管理:房间信息的增删改查,导出excel - 报修管理:报修信息列表查询,删除,审核 - 投诉管理:投诉信息列表查询,删除,审核 - 收费类型管理:收费类型信息的增删改查,关键词搜索 - 用户管理:物业人员信息的增删改查,住户信息的增删改查 - 定时任务管理:定时任务执行特定任务或数据处理任务 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>
内容概要:本文介绍如何利用Dify和飞书知识库构建智能问答助手,解决团队高效提取信息的难题。Dify作为一个开源AI平台,适合构建自然语言处理应用;飞书提供API接口,方便获取知识库内容。通过结合两者,可创建24/7在线的智能问答助手,减少人工搜索文档时间。文中详细描述了实现步骤:准备开发环境(获取飞书API权限、注册使用Dify、搭建环境)、获取飞书知识库内容(调用API、数据处理)、使用Dify进行智能问答(训练或使用现成模型、调用API)、构建问答服务(搭建后端服务、部署服务、配置飞书机器人)以及持续优化模型和知识库内容。 适合人群:对AI技术和企业协作工具有一定了解的企业IT人员、开发者。 使用场景及目标:①为企业内部提供全天候智能问答服务,自动回答常见问题;②减少人工搜索文档时间,提高工作效率;③通过用户提问日志优化AI模型,提升答案准确性。 阅读建议:在实践过程中,需结合实际需求调整API权限和模型训练,确保系统的实用性和高效性。同时,定期更新飞书知识库内容,保证信息的时效性和准确性。
内容概要:本文探讨了一种结合Transformer的全局注意力机制和LSTM的短期记忆及序列处理能力的数据回归预测模型,并引入了最新提出的GOOSE优化算法。Transformer通过自注意力机制捕捉数据的全局依赖性,LSTM则专注于捕捉短期依赖关系。GOOSE算法用于优化LSTM的隐含层神经元数目,从而提高模型的泛化能力和预测精度。文中提供了多个Python代码片段,展示了模型的具体实现和优化过程。实验结果显示,该模型在电力负荷预测、商品销量预测等场景中表现出色,预测误差显著降低。 适用人群:从事机器学习、深度学习研究的专业人士,尤其是对时间序列预测感兴趣的开发者和技术爱好者。 使用场景及目标:适用于需要同时考虑长期趋势和短期波动的时间序列预测任务,如电力负荷预测、股票价格预测、商品销售预测等。目标是提高预测精度,减少预测误差,增强模型的鲁棒性和泛化能力。 其他说明:文中提到的实际应用场景包括电力负荷预测和风电功率预测,强调了模型在处理异常波动数据时的优势。此外,还讨论了一些潜在的改进方向,如引入因果卷积和MoE架构等。 标签1: Transformer 标签2: LSTM 标签3: GOOSE优化算法 标签4: 时间序列预测 标签5: 自注意力机制
数据集介绍:脑肿瘤实例分割医疗影像数据集 一、基础信息 数据集名称:脑肿瘤实例分割医疗影像数据集 数据规模: - 训练集:803张医学影像 - 验证集:237张医学影像 - 测试集:129张医学影像 标注类别: - Brain_Tumor(脑肿瘤):包含各类脑部肿瘤病变区域标注 标注特性: - YOLO实例分割格式:通过多边形坐标点精确标注肿瘤边界 - 包含正常脑组织与肿瘤组织的对比样本 - 数据来源于临床医学影像采集系统 二、适用场景 医疗影像AI系统开发: 支持构建脑肿瘤自动识别与病灶定位系统,辅助医生进行术前规划与病灶量化分析 智能诊断工具研发: 可用于开发脑部CT/MRI影像智能分析工具,实现肿瘤位置、形态的精准三维重建 医学影像算法研究: 为深度学习在医学图像分割领域的研究提供标准测试基准,支持UNet、Mask R-CNN等算法的训练验证 放射科医师培训: 可作为教学材料帮助医师学习脑肿瘤的影像学特征识别与病灶标注规范 三、核心优势 临床精准性: - 标注结果经三甲医院放射科医师双重校验 - 涵盖胶质瘤、脑膜瘤等多种常见脑肿瘤类型 技术适配性: - 原生支持YOLOv5/v7/v8等主流实例分割框架 - 提供标准化的数据划分方案与验证指标 科研价值: - 包含完整病例的DICOM原始数据转换样本 - 标注数据呈现肿瘤异质性和边界模糊等临床特征 工程实用性: - 提供肿瘤区域面积占比等量化指标计算基准 - 支持医疗影像PACS系统直接对接的数据格式
内容概要:本文详细介绍了如何在Simulink中构建永磁同步电机(SVPWM)算法的故障诊断与容错控制模型。首先,通过搭建电流残差观测器进行故障诊断,采用瞬态突变和累积误差双重判据,确保能够及时捕捉到IGBT故障。接着,针对故障情况,提出了重构电压矢量的方法,将故障相的电压分配给其他相,从而实现系统的容错控制。此外,文中还讨论了模型中各个模块之间的耦合关系以及一些具体的实现细节,如故障注入模块、观测器环路延迟、磁饱和参数设置等。最后,通过仿真验证了该方法的有效性,展示了故障发生后系统的快速响应能力和良好的性能恢复。 适用人群:从事电机控制研究的技术人员、研究生及以上学历的相关专业学生。 使用场景及目标:适用于需要提高永磁同步电机控制系统可靠性的应用场景,特别是在工业自动化、电动汽车等领域。目标是在IGBT故障情况下,确保电机系统能够在短时间内恢复正常运行,减少故障带来的负面影响。 其他说明:文中提供了详细的MATLAB/Simulink代码片段,帮助读者更好地理解和实现相关算法。同时,强调了一些容易忽视的关键点,如IGBT模型的选择、采样周期的设定等,有助于提高仿真的准确性。
高速公路联网收费系统优化升级收费站标准化专项试点技术方案2024.11
内容概要:本文详细介绍了利用Matlab/Simulink实现锂离子电池荷电状态(SOC)估计的方法,特别关注扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)两种算法。首先,文章解释了二阶RC等效电路模型的基本原理及其参数设定,该模型用于描述电池内部动态行为。接着,分别阐述了EKF和UKF的工作机制,包括它们各自的状态预测和更新步骤,并给出了具体的MATLAB代码片段。此外,还讨论了这两种方法在不同工况下的表现差异以及如何选择合适的滤波器以提高估计精度。最后,强调了OCV-SOC曲线拟合质量和参数辨识的重要性,指出这是确保良好估计效果的关键因素之一。 适合人群:从事电池管理、电动汽车、储能系统等领域研究的技术人员,尤其是那些对卡尔曼滤波理论有一定了解并希望通过实际案例深入理解其应用的人士。 使用场景及目标:适用于需要精确估算锂离子电池SOC的研究项目或产品开发阶段,旨在帮助研究人员更好地掌握EKF和UKF的特点,从而为具体应用场景挑选最适合的算法。 其他说明:文中提供的代码仅为示例,实际应用时需根据具体情况调整参数配置。同时提醒读者重视电池模型本身的准确性,因为即使是最先进的滤波算法也无法弥补模型缺陷带来的误差。
内容概要:本文详细介绍了电动汽车动力系统的仿真技术,涵盖双向DCDC变换器的能量反馈机制和支持异步电机与永磁同步电机的仿真。文中展示了多个关键控制策略,如电流环控制、最大转矩电流比(MTPA)控制、弱磁控制以及基于事件触发的协调控制。通过MATLAB、Python和C等多种编程语言的具体代码实例,解释了如何实现高效的能量管理和电机控制。此外,文章还讨论了仿真过程中遇到的实际问题及其解决方案,如电压过冲、电流振荡和系统耦合等问题。 适合人群:从事电动汽车研究与开发的技术人员、高校相关专业师生、对电动汽车动力系统感兴趣的工程师。 使用场景及目标:适用于电动汽车动力系统的设计与优化,帮助工程师理解和掌握双向DCDC变换器的工作原理及电机控制策略,提高能量利用效率,确保系统稳定性。 其他说明:文章不仅提供了详细的理论和技术背景,还分享了许多实践经验,有助于读者更好地将理论应用于实际项目中。
内容概要:本文详细解析了RTMP(Real Time Messaging Protocol)协议规范,该协议由Adobe公司设计,主要用于音视频流传输,现已广泛应用于直播、点播、视频会议等场景。文章介绍了RTMP的核心设计,包括分块传输、多路复用、协议控制消息等机制,适用于低延迟、高并发的流媒体场景。文中解释了分块、消息流、字节序与对齐、时间戳等核心概念,并详细描述了RTMP的握手机制,包括三个阶段的握手过程。此外,还介绍了RTMP的数据包结构与分块格式,以及RTMP的几种变种协议(RTMPS、RTMPE、RTMPT)及其特点。最后,列举了RTMP的应用场景,如直播、点播、视频会议和远程控制等。 适合人群:从事音视频开发的技术人员,特别是对流媒体协议感兴趣的开发者和研究者。 使用场景及目标:①理解RTMP协议的工作原理和应用场景;②掌握RTMP协议的核心机制和技术细节;③学习RTMP协议的不同变种及其优缺点。 阅读建议:建议读者结合实际项目需求,重点关注RTMP协议的关键技术和应用场景,并参考提供的官方文档和实现库,以便更好地理解和应用RTMP协议。
基于springboot+vue的网上鲜花交易管理系统:前端 vue、elementui,后端 maven、springmvc、spring、mybatis;角色分为管理员,用户;集成商家,鲜花浏览,购物车等功能于一体的系统。 ## 功能介绍 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:主导航栏,轮播图,鲜花游览推荐,商家展示 - 商家:商家列表展示,按店铺名和店铺地址模糊搜索,商家详情,评论 - 鲜花:鲜花列表展示,按名称、用途、花语、店铺名模糊搜索,鲜花详情,购物车,在线结算 - 其他功能:系统公告,在线客服,鲜花结束 - 个人中心:个人信息查看与修改,我的订单查询,我的修改维护,我的收藏列表 ### 管理员 - 用户管理:用户信息的增删改查,用户也可以在前台自行注册 - 商家管理:商家信息的增删改查,查看商家评论,评论回复,评论删除 - 鲜花分类管理:分类信息的增删改查 - 鲜花管理:鲜花信息的增删改查,图片上传,查看评论,评论回复,评论删除 - 系统管理:系统公告管理,在线客服,轮播图管理 - 订单管理:用户下单后,管理员查看用户订单,发货操作 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>