当前位置: 首页 > 编程笔记 >

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

闻人越
2023-03-14
本文向大家介绍Java Annotation注解相关原理代码总结,包括了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 "";
}

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

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

 类似资料:
  • 本文向大家介绍Java注解Annotation原理及自定义注解代码实例,包括了Java注解Annotation原理及自定义注解代码实例的使用技巧和注意事项,需要的朋友参考一下 什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方

  • 本文向大家介绍PHP针对伪静态的注入总结【附asp与Python相关代码】,包括了PHP针对伪静态的注入总结【附asp与Python相关代码】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP针对伪静态的注入。分享给大家供大家参考,具体如下: 一:中转注入法 1.通过http://www.xxx.com/news.php?id=1做了伪静态之后就成这样了 http://www.xxx.

  • 本文向大家介绍关于Ajax的原理以及代码封装详解,包括了关于Ajax的原理以及代码封装详解的使用技巧和注意事项,需要的朋友参考一下 前言 其实AJAX内部实现并不麻烦,主要通过一个叫XMLHttpRequest的对象,而这个对象在现有的浏览器均被支持。 可以说,它是整个AJAX实现的基础,是浏览器用于后台与服务器交换数据的对象,有了它,才有了AJAX,也便有了部分页面刷新的艺术! 本文主要给大家介

  • 本页列出注解相关常见问题,欢迎大家补充。 如何忽略一些我不想被扫描到的类? 在项目配置文件中配置: return [ // 忽略扫描的命名空间 'ignoreNamespace' => [ 'Imi\Test\Component\Annotation\A\*', // 忽略扫描该命名空间下所有类 'Imi\Test\Component\A

  • 本文向大家介绍Spring HandlerInterceptor实现原理代码解析,包括了Spring HandlerInterceptor实现原理代码解析的使用技巧和注意事项,需要的朋友参考一下 HandlerInterceptor 在这里看到这个HandlerExecutionChain对interceptor的调用,在这里深入看一下。 HandlerExecutionChain 就是一个类,绑

  • 这就是我现在对关联、聚合和组合的理解。 协会 聚集 构成 我认为理解这些词的意思是没有意义的,除非我不能在实际代码中表示它。以上代码取自SO答案(如果以上代码错误,请告诉我)。 我的问题是闪烁。 1) 在类图中显示聚合和组合是否重要 2) 我使用了一个可以转换java的工具。将文件分类到类图中。类可视化工具,但我无法使此工具在类图中显示聚合或组合关系。这是工具的问题还是我不了解如何在代码中使用组合