java注解详解和自定义注解

飞牛fnNAS虚拟机标准安装 飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。 阅读详情

原文地址:点这里

文首先介绍了注解的基本概念和JDK内置的标准注解,然后介绍了如何自定义注解,最后给出了自定义注解的例子。

一、注解的基本概念

Java 注解就像修饰符一样,可以用于从java代码中抽取文档、跟踪代码中的依赖性或者在编译时做检查。注解可以被应用在包、类、方法、成员变量、参数和本地变量的声明中。我们大多数人最先接触的注解就是@Override。

注解的工作原理就是,先使用注解修饰java代码,然后另一块叫做注解处理器的代码会解析这段注解和被修饰的代码并做相应的处理。

二、JDK内置的标准注解

JavaSE中内置了三个标准注解,都是定义在java.lang中,它们是:

  1. @Override:用于修饰子类的方法覆盖了父类中的方法;
  2. @Deprecated:用于修饰已经过时了的方法,不推荐使用的方法;
  3. @SuppressWarnnings:告诉java编译器禁止编译警告。

2.1 @Override

@Override很简单,只是一个标记,用于标注一个方法。它表示,被它标注的方法覆盖了父类的方法。如果一不小心,子类的方法名写错了,有了@Override之后,编译时会报错。也就是说被@Override标注的方法如果没有覆盖父类的方法,编译时报错。

2.2 @Deprecated

@Deprecated也是一个标记注解,用于修饰一个方法。它表示此方法不推荐使用。无论是继承、覆盖或直接使用此方法,编译器都会给出警告。

2.3 @SuppressWarnings

字面翻译就是抑制警告,它用于告诉编译器,对被标注的这句代码不要给出特定的警告。

@SuppressWarnings有一些参数用于表示特定的警告:

  1. deprecation:不要给出“不赞成使用的类或方法的警告”;
  2. unchecked:不要给出“类型转换时警告”;
  3. fallthrough:不要给出”switch语句块没有break的警告”;
  4. path:不要给出“不存在的路径”的警告;
  5. serial:不要给出“可序列化类缺少serialVersionUID”的警告;
  6. finally:不要给出“finally语句块不能正常完成”的警告;
  7. all:不要给出以上所有情况的警告。

三、 自定义注解

java允许我们自己定义注解,它提供了元注解用于自定义注解。

3.1 元注解

java提供元注解的目的就是让开发者自定义注解,元注解负责注解自定义注解。

  1. @Target;
  2. @Retention;
  3. @Documented;
  4. @Inherited。

Java5.0定义了4个元注解。接下来,分别分析这四个元注解:

3.1.1 @Target

@Target用来说明自定义注解可以用在什么地方,其ElementType取值有:
1. CONSTRUCTOR:用于描述构造器
2. FIELD:用于描述域
3. LOCAL_VARIABLE:用于描述局部变量
4. METHOD:用于描述方法
5. PACKAGE:用于描述包
6. PARAMETER:用于描述参数
7. TYPE:用于描述类、接口(包括注解类型) 或enum声明

使用示例:@Target(ElementType.FIELD)

3.1.2 @Retention

@Retention用来描述自定义注解的生命周期,其RetentionPoicy取值有:
1. SOURCE:在源文件中有效
2. CLASS:在class文件中有效
3. RUNTIME:在运行时有效

使用示例:@Retention(RetentionPolicy.RUNTIME)

3.1.3 @Documented

@Documented用于表示自定义注解可以被javadoc之类的工具文档化,没有成员。

使用示例:@Documented

3.1.4 @Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

使用示例:@Inherited

3.2 开始自定义注解

定义注解格式:

  public @interface 注解名 {定义体}

注解参数的可支持数据类型:

  1. 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  2. String类型
  3. Class类型
  4. enum类型
  5. Annotation类型
  6. 以上所有类型的数组

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

注意:

  • 只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型; 

  • 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  

  • 如果只有一个参数成员,最好把参数名称设为”value”,后加小括号.

3.3 例子

定义一个注解@Persion:

package com.zcx.annotation;

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Persion {
    String name() default "zcx";
    int age() default 18;

    String[] hobby() default {"basketball", "football"};
}

再定义一个注解@StudentGender:

package com.zcx.annotation;

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentGender {

    public enum Gender{BOY, GIRL};
    Gender gender() default Gender.BOY;

}

定义一个类,使用刚才定义的两个注解:

package com.zcx.annotation;

import com.zcx.annotation.StudentGender.Gender;

@Persion(name="haha", age=97, hobby={"test1", "test2"})
public class Student {


    @StudentGender(gender=Gender.BOY)
    private String stuGender;


    public String getStuGender() {
        return stuGender;
    }
    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }
}

定义一个注解处理器,用于处理注解内容:

package com.zcx.annotation;

import java.lang.reflect.Field;


public class AnnotationProcessor {
    public static void getStudentInfo(Class<?> clazz){
        if(clazz.isAnnotationPresent(Persion.class)){
            Persion annotation = (Persion)clazz.getAnnotation(Persion.class);
            System.out.println(annotation);
            System.out.println(annotation.age());
            System.out.println(annotation.name());
            String[] hobby = annotation.hobby();
            for(String str : hobby){
                System.out.println(str);
            }
        }
        Field[] fields = clazz.getDeclaredFields();

        for(Field field :fields){
            System.out.println("fieldName=" + field.toString());
            if(field.isAnnotationPresent(StudentGender.class)){
                StudentGender annotation = (StudentGender)field.getAnnotation(StudentGender.class);
                System.out.println(annotation);
                System.out.println(annotation.gender());
            }
        }
    }
}

最后,定义测试类:

package com.zcx.annotation;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        AnnotationProcessor.getStudentInfo(Student.class);
    }
}
YOLOv12超参数智能优化:基于内置Ray Tune的自动化调优实战指南 购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 目标检测模型的性能瓶颈往往源于超参数配置不当。传统手动调优方式不仅耗时耗力,且难以找到全局最优解。YOLOv12集成的Ray Tune框架为解决这一难题提供了完整方案,通过分布式异步优化算法,可实现超参数搜索效率的指数级提升。实际测试表明,采用Ray Tune自动调优的YOLOv12模型,在COCO数据集上mAP指标平均提升3.8%,收敛速度加快2.1倍。在VisDrone无人机数据集上的跨域测试 阅读详情

相关推荐

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 374

java自定义注解详解

一: 注解的概念 1.1 注解的官方定义 首先看看官方对注解的描述: An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they an

向上的"狼"的博客 2079

通讯模块_三菱IQ-R PLC串口通讯模块RJ71C24进行Modbus-RTU通讯

在日常的选型中,很多电气工程师咨询我,三菱iQ-R系列有没有Modbus通讯模块,我在这里可以肯定的回复您,这个肯定是有的;我们共有三种可以选择分别是RJ71C24、RJ71C24-R2、RJ71C24-R4。RJ71C24系列支持MC协议通信、通信协议通信、无顺序协议通信、双向协议通信全、MODBUS通信。当我帮助他们选型之后,他们在使用的时候,又是一头雾水。那么今天我抽一些时间讲解一RJ71...

weixin_39878549的博客 9274

一文详解Java自定义注解

一文详解Java自定义注解

loseyourself94的博客 3340

泛微E9与金蝶云星空单点登录集成实战指南

本文详细介绍了泛微E9与金蝶云星空单点登录(SSO)集成的实战指南,包括前期准备、核心代码实现、常见问题排查及安全加固建议。通过集成,企业可实现一次登录全网通行,显著提升工作效率和安全性。文章特别强调了签名生成机制和跳转URL构造的关键技巧,帮助开发者避免常见错误。

weixin_30689307的博客 535

Nexus7二代刷机教程(新手向)

该教程将使用lineageos(Android 11),同时借鉴了lineage官方的教程和songelf的教程。

2403_84391487的博客 5217

一文详解Java自定义注解及使用场景

Java自定义注解是一种元数据,可以在Java程序中用来提供程序中的元数据信息。自定义注解允许开发人员在代码中嵌入元数据,这些元数据可以在编译时和运行时被读取和处理。Java注解是一种元数据,可以在代码中添加注释和标记,用于提供额外的信息和指示。它是Java开发中的一项重要技术,可以简化开发流程、提高代码的可读性和可维护性。本文将详细介绍Java注解的概念、使用方法以及如何自定义注解,以及注解在框架开发和代码分析中的应用。

攻城狮不是猫 3896

HyperLynx实战:手把手教你搞定DDR4信号完整性仿真(附ODT与终端电阻配置避坑)

本文详细介绍了使用HyperLynx进行DDR4信号完整性仿真的实战技巧,重点解析了ODT配置与终端电阻优化的黄金法则。通过模型准备、拓扑构建、ODT扫描等关键步骤,帮助硬件工程师规避常见设计陷阱,提升高速数字电路设计的效率与可靠性。

weixin_30861797的博客 641

Java | 自定义注解及解析

先来看内置注解@Override是怎么被定义的,它位于@Target定义声明注解的作用域(作用在类上还是方法上),@Retention定义注解在哪个级别可用,在源代码中(SOURCE)、类文件中(CLASS)、还是运行时(RUNTIME除了还有及@Inherited元注解作用@Target表示注解作用在什么地方,声明在构造器、FIELD域声明、METHOD方法声明、PACKAGE包声明、TYPE类、接口或者enum声明、PARAMETER参数声明、局部变量声明@Retention。

小马快跑的博客 9437

QtWebApp的使用【在Qt中搭建HTTP服务器】(一)

用Qt和QtWebApp能够实现在C++中开发HTTP Web服务器应用程序。 首先,需要先安装Qt的软件开发工具包。点此下载 其次,下载最新的QtWebApp库。点此下载 下载并解压缩QtWebApp ZIP文件。你将会看到: 如何使用QtWebApp 1)将QtWebApp.zip文件解压到文件夹中,并创建一个名为“ MyFirstWebApp”的新Qt控制台项目。然后,建立如下文件结构: 2)将以下行添加到MyFirstWebApp项目的项目文件中: QT += network include(

饭的笔记本 2万+

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案)

本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。

e3f4g5的博客 216

java - 注解解析与自定义

一.Annotation 注解的基本结构就是一个@加字符,可以放在需要修饰的类、方法、变量和参数等元素前面。 Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。 Annotation可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。 Java中有五个元注解 (即作用在其它注解的标准注解):@Retention、@Documented、@Target、@Inherited、@Repeatable。 ...

m0_47914176的博客 499

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2881

java 注解和自定义注解详解

定义 注解是在JDK1.5之后引入的新特性位于​java.lang.annotation​,注解其实就是对代码进行一种特殊的标记,这些标记可以在编译,类加载和运行时被读取,并执行相应的处理。 第三方注解 在Java开发者,JDK自带了一些注解,在第三方框架Spring 带了大量的注解,这些注解称为第三方注解 1、Jdk通用注解 @Override注解:编译检查,告诉编译器这个是个覆盖父类的方法。如果父类删除了该方法,则子类会报错。 @Target({ElementType.METHOD}) @.

Crystalqy的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java注解详解和自定义注解

Java注解以及自定义注解

weixin_46145858的博客 520

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java注解详解和自定义注解实战,用代码讲解

Java注解(Annotation)用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java注解是从 Java5 开始添加到 Java 的。--官方文档自定义注解实际上就是一种类型而已,也就是引用类型(Java中除了8种基本类型之外,我们见到的任何类型都是引用类型)自定义注解过程:声明一个类MyAnnotation把class关键字改为@interface这样我们就声明了一个自定义的注解,当我们用@interface。

weixin_74412978的博客 769

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

代码讲解 Java注解详解和自定义注解实战

Java注解(Annotation)用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java注解是从Java5开始添加到Java的。--官方文档2.1、注解Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。我们常常使用的注解,等等,这些都是注解,创建一个注解,也很简单,创建一个类,然后将class改为@interfaceJava。...

Trouvailless的博客 851

java中的注解详解和自定义注解

一、java中的注解详解   1、什么是注解     用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。比如,下面这段代码: @Override public String toString() { return "This is String Representation of current object."; }  ...

weixin_30687811的博客 132
上一篇: SpingAOP+redis实现缓存
下一篇: Nginx+Tomcat+Redis负载均衡Session共享实现
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值