Java Annotation注解相关原理代码总结
作者:Haidnor 发布时间:2023-11-18 02:13:57
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 "";
}
使用反射获取注解的方法流程图
来源:https://www.cnblogs.com/Haidnor/p/13237985.html


猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String,
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 前言fragment 可认为是一个轻量级的Activity,但不同与Activity,它是要嵌到Activity中来使用的,它用来解决设备屏
- Android Studio 运行后出现了下面的错误Emulator: Process finished with exit code 1E
- 介绍try-with-resources是Java中的环绕语句之一,旨在减轻开发人员释放try块中使用的资源的义务。它最初在Java 7中引
- 性能优化点:1.使用int不使用double。(单位用分不用元)也省去了还要用math.round四舍五入,把double类型数据只留小数点
- 今天写项目突然出现了无法启动Gradle的bug,如下图然后就看了log日志:这个问题是我第一次看见,然后就开始了各种百度,有说需要在And
- 一、什么是队列队列是一个有序列表,可以用数组或者链表来实现。遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的的数据,后取出。看一
- 最近在一本J2EE的书中看到了很不错的对集合框架的说明文章,筛选后发上来和大家共享,集合框架提供管理对象集合的接口和类.它包含接口,类,算法
- 本文实例为大家分享了Android Service实现自动更换手机壁纸的具体代码,供大家参考,具体内容如下先看下效果:使用界面:划重点,使用
- Thread类相对于线程池中的线程,使用者有更多的控制权。该类允许创建前台线程,设置线程优先级等。Thread类的构造函数重载为接受Thre
- 最近工作的时候发现软件里面通过查询ARP表查询某一IP对应的ARP条目的时,概率性出现查询到的ARP条目为空,一开始怀疑Ping通但是没有学
- 下面的这些都算是比较高级的问题了,面试中一般也很少问到,因为它们可能会把面试者拒之门外。不过你可以自己找个时间来实践一下。 1.
- 前言上篇Java Mybatis数据源之工厂模式文章中我们介绍了Mybatis的数据源模块的DataSource接口和它对应的实现
- 一、前言Hello,又见面了,今天分享如何使用Unity制作计算器,难度中等,可以用来学习,或者当成其他项目的小组件导入。当然,也可以导出来
- 一、网络爬虫的基本知识网络爬虫通过遍历互联网络,把网络中的相关网页全部抓取过来,这体现了爬的概念。爬虫如何遍历网络呢,互联网可以看做是一张大
- 简单工厂模式解释: 简单工厂模式(Simple Fact
- 在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说
- 好了下面进入正题,我们先看一下实现效果吧:下面来介绍一下代码: 本思路就是:1.先到手机中扫描jpeg和png的图片2.获取导图片
- 3.3 do...while()循环3.3.1 do语句的语法:do