Java Annotation注解相关原理代码总结

Java.lang 中自带的注解

  • @Override:表示当前的方法定义将覆盖基类的方法。如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示。
  • @Deprecated:如果使用该注解的元素被调用,编译器就会发出警告信息。
  • @SuppressWarnings:关闭不当的编译器警告信息。
  • @SafeVarargs:在 Java 7 中加入用于禁止对具有泛型varargs参数的方法或构造函数的调用方发出警告。
  • @FunctionalInterface:Java 8 中加入用于表示类型声明为函数式接口

如何定义注解

以下是一个为标记注解(marker annotation), 不包含任何元素

package cn.haidnor.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {

}

注解的定义也需要一些元注解(meta-annoation),比如 @Target 和 @Retention。

@Target 定义你的注解可以应用在哪里(例如是方法还是字段)。

@Retention 定义了注解在哪里可用,在源代码中(SOURCE),class文件(CLASS)中或者是在运行时(RUNTIME)。

Demo 简单实例

定义注解

以下的代码中。Target 定义只能在方法上使用,Retention 定义保留域

package cn.haidnor.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
  int id();
  String description() default "no description";
}

在类中使用注解

package cn.haidnor.clazz;
package cn.haidnor.clazz;
import cn.haidnor.annotation.UseCase;
import java.util.List;

public class PasswordUtils {
  @UseCase(id = 47, description ="Passwords must contain at least one numeric")
  public boolean validatePassword(String passwd) {
    return (passwd.matches("\\w*\\d\\w*"));
  }
  @UseCase(id = 48)
  public String encryptPassword(String passwd) {
    return new StringBuilder(passwd)
        .reverse().toString();
  }
  @UseCase(id = 49, description = "New passwords can't equal previously used ones")
  public boolean checkForNewPassword(
      List<String> prevPasswords, String passwd) {
    return !prevPasswords.contains(passwd);
  }
}

对以上 demo 中的代码进行测试

package cn.haidnor.test;

import cn.haidnor.annotation.UseCase;
import cn.haidnor.clazz.PasswordUtils;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.*;
import java.lang.reflect.*;

public class UseCaseTracker {

  public static void main(String[] args) {
    List<Integer> useCases = IntStream.range(44, 51)
        .boxed().collect(Collectors.toList());
    trackUseCases(useCases, PasswordUtils.class);
  }

  public static void trackUseCases(List<Integer> useCasesList, Class<?> clazz) {
    // getDeclaredMethods() 获取所有公开的方法
    for(Method m : clazz.getDeclaredMethods()) {
      // getAnnotation() 获取指定注解
      UseCase uc = m.getAnnotation(UseCase.class);
      if(uc != null) {
        System.out.print("Found Use Case ");
        // 提取注解元素值
        System.out.println(uc.id());
        // 提取注解元素值
        System.out.println('\t' + uc.description());
        useCasesList.remove( Integer.valueOf( uc.id() ) );
      }
    }

    // 迭代集合
    useCasesList.forEach(new Consumer<Integer>() {
      @Override
      public void accept(Integer integer) {
        System.out.println("Missing use case " + integer);
      }
    });
    // 以上代码可以使用箭头行数简写
    // useCasesList.forEach(i -> System.out.println("Missing use case " + i));
  }
}

控制台输出结果

Found Use Case 47
  Passwords must contain at least one numeric
Found Use Case 48
  no description
Found Use Case 49
  New passwords can't equal previously used ones
Missing use case 44
Missing use case 45
Missing use case 46
Missing use case 50

元注解

Java 语言中目前有 5 种标准注解(前面介绍过),以及 5 种元注解。元注解用于注解其他的注解

注解中可以使用的元素

所有基本类型(int、float、boolean等)

  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

其他类型,编译器就会报错。注意,也不允许使用任何包装类型

  • 注解的默认值

无论是在源代码声明时还是在注解接口中定义默认值时,都不能使用 null 作为其值。

import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SimulatingNull {
  int id() default -1;
  String description() default "";
}

使用反射获取注解的方法流程图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java javax.annotation.Resource注解的详解

    java 注解:java javax.annotation.Resource  当我们在xml里面为类配置注入对象时,会发现xml文件会越来越臃肿,维护起来很麻烦.这时候我们可以使用注解这种机制来为类配置注入对象. Java为我们提供了 javax.annotation.Resource这个注解. spring框架提供了org.springframework.beans.factory.annotation.Autowired. 一般情况下我们使用 javax.annotation.Resour

  • 深入理解Java注解类型(@Annotation)

    Java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于一个Java工程师是来说是很有必要的事.本篇我们将通过以下几个角度来分析注解的相关知识点 理解Java注解 实际上Java注解与普通修饰符(public.static.void等)的使用方式并没有多大区别,下面的例子是常见的注解: public class AnnotationDemo { //@Test注解修饰方法A @Test public static

  • Java注解Annotation与自定义注解详解

    一:Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识该方法继承自超类, 当父类的方法被删除或修改了,编译器会提示错误信息(我们最经常看到的toString()方法上总能看到这货) @Deprecated:表示该类或者该方法已经不推荐使用,已经过期了,如果用户还是要使用,会生成编译的警告 @SuppressWarnings:用于忽略的编译器警告信息

  • 详解Java编程中Annotation注解对象的使用方法

    注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据.   1.基本语法 Java SE5内置三种标准注解 @Override:表示当前的方法定义将覆盖超类中的方法.如果你不小心拼写错误,或者方法签名对不上被覆 盖的方法,编译器就会发出错误提示 @Deprecated:如果程序员使用了注解为它的元素,那么编译器就会发出警告信息 @SupperessWarnings:关闭不当的编译器警告信息. Java SE5内置四种元注解 @Targ

  • 5分钟搞懂java注解@Annotation的具体使用

    首先一句话结论:注解就是一种通过在类.方法.或者属性等上使用类似@xxx的方式进行"打标签",然后可以通过反射机制对标签的内容进行解析并进行相应处理的手段. 注解是java中的一个重要知识点,从java5后开始引入,尤其在spring框架中大量使用.比较常用的有@controller.@service等等各种,本文将从注解的实现原理出发,通过一些demo代码的实现,进行分析. 一. 注解定义方式 直接上代码,看看spring中@Service注解的定义就知道了: @Target({El

  • java教程之java注解annotation使用方法

    1.概述 注解可以定义到方法上,类上,一个注解相当与一个类,就相当于实例了一个对象,加上了注解,就相当于加了一个标志. 常用的注解:@Override:表示重新父类的方法,这个也可以判断是否覆盖的父类方法,在方法前面加上此语句,如果提示的错误,那么你不是覆盖的父类的方法,要是提示的没有错误,那么就是覆盖的父类的方法.@SuppressWarnings("deprecation"):取消编译器的警告(例如你使用的方法过时了)@Deprecated:在方法的最上边也上此语句,表示此方法过时

  • java 注解annotation的使用以及反射如何获取注解

     一.注解基本知识 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口. 2. 参数成员只能用public或默认(default)这两个访问权修饰 3. 参数成员只能用基本类型byte,short,char,int,long,float,doubl

  • Java Annotation(Java 注解)的实现代码

    如果你想知道java annotation是什么?你可以先看看:"http://www.infoq.com/articles/Annotation-Hammer" 下面是我做的一个demo: 项目结构: 运行效果: ==================================================== 代码部分: 注:很多人会考虑这个问题,"这样做的目的是什么?我们可以做一个配置文件(xml,properties等),不是比这个跟方便...或者说 直接把我们

  • Java Annotation注解相关原理代码总结

    Java.lang 中自带的注解 @Override:表示当前的方法定义将覆盖基类的方法.如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示. @Deprecated:如果使用该注解的元素被调用,编译器就会发出警告信息. @SuppressWarnings:关闭不当的编译器警告信息. @SafeVarargs:在 Java 7 中加入用于禁止对具有泛型varargs参数的方法或构造函数的调用方发出警告. @FunctionalInterface:Java 8 中加入用于表

  • Java 内省introspector相关原理代码解析

    1. JavaBean (有get/set属性,和默认构造器等规范的java类) import java.util.Date; public class Student { // 这是 字段 private String name; private int age; private Date birthday; // 这是 属性 //(get.set开头的方法,getName.setName算一个属性,单独一个set或get也算一个属性) // 属性名为 去掉get.set后 第一个大写字母变小

  • Java中注解与原理分析详解

    目录 一.注解基础 二.注解原理 三.常用注解 1.JDK注解 2.Lombok注解 四.自定义注解 1.同步控制 2.类型引擎 一.注解基础 注解即标注与解析,在Java的代码工程中,注解的使用几乎是无处不在,甚至多到被忽视: 无论是在JDK源码或者框架组件,都在使用注解能力完成各种识别和解析动作:在对系统功能封装时,也会依赖注解能力简化各种逻辑的重复实现: 基础接口 在Annotation的源码注释中有说明:所有的注解类型都需要继承该公共接口,本质上看注解是接口,但是代码并没有显式声明继承关

  • 浅谈Java自定义注解相关知识

    一.自定义注解格式 分析 Java 中自带的 @Override 注解 , 源码如下 : @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 注解分为两部分 : ① 元注解 ; ② public @interface 注解名称 ; 二.注解本质分析 按照 public @interface 注解名称 格式 , 写出一个注解 , 编译该注解代码生成 Annotat

  • Java IO流相关知识代码解析

    一.IO流的分类 字符流 Reader InputStreamReader(节点流) BufferedReader(处理流) Writer OutputStreamWriter(节点流) BufferedWriter(处理流) PrintWriter 字节流 InputStream FileInputStream(节点流) BufferedInputStream(处理流) ObjectInputStream(处理流) PrintStream OutputStream FileOutputStre

  • Java CAS基本实现原理代码实例解析

    一.前言 了解CAS,首先要清楚JUC,那么什么是JUC呢?JUC就是java.util.concurrent包的简称.它有核心就是CAS与AQS.CAS是java.util.concurrent.atomic包的基础,如AtomicInteger.AtomicBoolean.AtomicLong等等类都是基于CAS. 什么是CAS呢?全称Compare And Swap,比较并交换.CAS有三个操作数,内存值V,旧的预期值E,要修改的新值N.当且仅当预期值E和内存值V相同时,将内存值V修改为N

  • Java调用groovy实现原理代码实例

    一.概述 Groovy is a multi-faceted language for the Java platform. Apache Groovy是一种强大的.可选的类型化和动态语言,具有静态类型和静态编译功能,用于Java平台,目的在于通过简洁.熟悉和易于学习的语法提高开发人员的工作效率.它可以与任何Java程序顺利集成,并立即向您的应用程序提供强大的功能,包括脚本编写功能.特定于域的语言编写.运行时和编译时元编程以及函数式编程. Groovy是基于java虚拟机的,执行文件可以是简单的

  • java中注解机制及其原理的详解

    java中注解机制及其原理的详解 什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.它主要的作用有以下四方面: 生成文档,通过代码里标识的元数据生成javadoc文档. 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证. 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码. 运行时动态处理,运行时通过代码里标识

  • JAVA注解相关知识总结

    注解的概念 java注解: 比较官方的说法: 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理.通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息. 注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值. 说说我的理解 注解

随机推荐