元注解


要声明一个注解, 我们需要元注解, 元注解是指注解的注解,包括@Retention, @Target, @Document, @Inherited.

@Retention

注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:

  • SOURCE 注解仅存在于源码中,在class字节码文件中不包含, 如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
  • CLASS 默认的保留策略,注解在class字节码文件中存在,但运行时无法获得, 如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解
  • RUNTIME 注解在class字节码文件中存在,在运行时可以通过反射获取到, 如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解

@Inherited

说明子类可以继承父类中的该注解

@Documented

声明注解能够被javadoc等识别

@Target

用来声明注解范围(枚举ElementType),ElementType可选值:

  • TYPE 接口、类、枚举、注解
  • FIELD 字段、枚举的常量
  • METHOD 方法
  • PARAMETER 方法参数
  • CONSTRUCTOR 构造函数
  • LOCAL_VARIABLE 局部变量
  • ANNOTATION_TYPE 注解
  • PACKAGE

Demo


1.声明注解类型

@Target(value = ElementType.METHOD) //声明该注解的运行目标: 方法
@Retention(value = RetentionPolicy.RUNTIME) //该注解的生命周期: 运行时
public @interface CanRun { // 通过@interface表示注解类型
String str() default "wow"; // 注解中携带的元数据
}

2.使用自定义注解

public class AnnotationRunner {

    public void method1() {
System.out.println("method 1");
} @CanRun(str = "foobar") // 方法2添加了自定义注解的标签同时传入str值
public void method2() {
System.out.println("method 2");
} public void method3() {
System.out.println("method 3");
} }

3.测试自定义注解

public class AnnotationTest {

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
AnnotationRunner runner = new AnnotationRunner();
Method[] methods = runner.getClass().getMethods(); for (Method method : methods){
CanRun annos = method.getAnnotation(CanRun.class);
//System.out.println("1"); if (annos != null){
method.invoke(runner);
System.out.println(annos.str());
}
}
}
}

运行结果:

method 2
foobar

Java中的自定义注解的更多相关文章

  1. java中的自定义注解的使用

    https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

  2. [转]Java中实现自定义的注解处理器

    Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...

  3. Java中常见的注解

    Java中常见的注解 1.JDK自带的注解@Override  @Deprecated  @Suppvisewarnings 常见第三方注解 Spring:@Autowired  @Service  ...

  4. Java中的元注解

    注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据. 通过使用注解,我们可以将这些元数据保存在Java源代码中,并利用annotation API为自己的 ...

  5. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  6. 在springMVC中使用自定义注解来进行登录拦截控制

    1:java注解使用是相当频繁,特别是在搭建一些框架时,用到类的反射获取方法和属性,用的尤其多. java中元注解有四个: @Retention     @Target     @Document  ...

  7. Java反射与自定义注解

    反射,在Java常用框架中屡见不鲜.它存在于java.lang.reflact包中,就我的认识,它可以拿到类的字段和方法,及构造方法,还可以生成对象实例等.对深入的机制我暂时还不了解,本篇文章着重在使 ...

  8. Java:深入自定义注解(Annotation)

    在网上找了很多资料也有写的比较好的,但是总有有一点半点的细节没有写出来,在这里自己总结下使用. 使用Java的自定义注解,首先个人需要了解下Java为我们提供的元注解和相关定义注解的语法.(这个我在网 ...

  9. 一起来看一下Java中的Annotation注解

    目录: 一. 什么是Annotation 二. Annotation的作用 2.1 编译器使用到的注解 2.2 .class文件使用到的注解 2.3 运行期读取的注解 三. 定义Annotation ...

随机推荐

  1. PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;

    <?php /** * Description * @authors Your Name (you@example.org) * # 根据时时彩的最新一期的号码, 判断如果为首尾同号则发送短信 ...

  2. LINUX-初始化一个文件系统

    mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1 ...

  3. SpringMVC中@Controller和@RequestMapping用法和其他常用注解(转)

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  4. SecureCRT 8.0设置与使用

    1.设置回看缓冲信息的行数:

  5. saltstack(七)返回值

    一.自定义创建模块 在base目录下创建_modules目录,你自己编写的模块都可以存放在该目录下,当前目录结构下: 1 2 3 4 5 6 7 8 [root@localhost:]# tree - ...

  6. 百练2815:城堡问题(DFS)

    描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...

  7. VMWare学习总结(1)——Centos7安装完毕后无法联网的解决方法

    在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...

  8. Oracle删除约束和主键的语句

    https://blog.csdn.net/xue_yanan/article/details/78210654?locationNum=8&fps=1

  9. BZOJ(4) 1050: [HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3984  Solved: 2236[Submit][St ...

  10. 1. CountDiv 数数有几个 Compute number of integers divisible by k in range [a..b].

    package com.code; public class Test05_1 { public static int solution(int A, int B, int K) { // handl ...