Java自定义注解和元注解

简介: <div class="markdown_views"><h1 id="自定义annotation">自定义annotation</h1><p>先看一个注解实例:</p><pre class="prettyprint"><code class="language-java hljs "><span class="hljs-keyword">import</span

自定义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;
/*-----------------定义注解--------------------*/
@Retention(RetentionPolicy.SOURCE)//声明注释保留时长
@Target(ElementType.METHOD)//声明可以使用此注解的元素级别类型(如类、方法变量等)
@Documented//表示当标注了NeedRecord注解的对象在被javadoc生成文档时,NeedRecord注解将会被API文档记录
public @interface NeedRecord {//定义注解
    String userName() default "anonymous";//定义注解成员,同时用default声明默认值,如果不想声明默认值,去掉default部分即可
    String value() ;
}
/*------------------使用注解实例1-----------------*/
@NeedRecord("login")
public void login(){
    System.out.println("I'm zenghao ,I'm logining");
}
/*------------------使用注解实例2-----------------*/
@NeedRecord(userName = "zenghao",value = "login")
public void login(){
    System.out.println("I'm zenghao ,I'm logining");
}

除了程序中注释提到的细节外,还有几点是需要注意的:
1. 使用注解的格式为@注解名(key1 = value1,key2 = value2 …..),当以@注解名(thisValue)来标注注解时,thisValue默认对应与注解内的value属性,如果注解内未定义value属性,则会编译出错。
2. 注解属性不能有入参(如value(name)),也不能声明异常(如value() throws Exception)
3. 属性的类型只能为原始类型及其包装类或相应的数组类型,不能是自定义类型,如声明MyClass myClass();则会出现编译错误Invalid type MyClass for the annotation attribute NeedRecord.myClass; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof

元注解

上面实例中我们用到的@Retention,@Target,@Documented都是Java预定义的元注解,他们只能在我们自定义注解的时候使用,下面来分析分析这些注解的用法。

1. @Retention

用于声明我们自定义的注解的存活时间,它的属性value有三个对应的值
1. RetentionPolicy.SOURCE:在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
2. RetentionPolicy.CLASS:默认值,编译器仅把注解保存在class文件中,在运行java程序时,JVM不会保留注释,即不能用反射(在运行期)来获取注释
3. RetentionPolicy.RUNTIME:编译器不仅把注解保存在class文件中,同时在运行java程序时,JVM也会保留注释,即可以通过反射来获取注释


2. @Target

用于指定自定义的注解能够修饰哪些元素,其value属性指明了注解对象,有如下几个值供选择:
- ElementType.TYPE:修饰类、接口或枚举(enum)
- ElementType.FIELD:注解成员变量
- ElementType.METHOD:注解方法
- ElementType.PARAMETER:注解方法参数
- ElementType.CONSTRUCTOR:注解构造函数
- ElementType.LOCAL_VARIABLE :注解局部变量
- ElementType.ANNOTATION_TYPE 注解另一个自定义注解
- ElementType.PACKAGE 注解包

3. @Documented

比如注解A被标注@Documented,B被A标注,则用javadoc对B类生成API文档时,在类声明上会出现注解A记录。

目录
相关文章
|
2月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
76 1
|
28天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
62 7
|
2月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
45 1
|
3月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
62 3
|
24天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
105 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
78 5
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
67 14
|
3月前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
71 1
|
2月前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
43 0