时间:2021-05-20
Java.lang 中自带的注解
如何定义注解
以下是一个为标记注解(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 numericFound Use Case 48 no descriptionFound Use Case 49 New passwords can't equal previously used onesMissing use case 44Missing use case 45Missing use case 46Missing use case 50元注解
Java 语言中目前有 5 种标准注解(前面介绍过),以及 5 种元注解。元注解用于注解其他的注解
注解中可以使用的元素
所有基本类型(int、float、boolean等)
其他类型,编译器就会报错。注意,也不允许使用任何包装类型
无论是在源代码声明时还是在注解接口中定义默认值时,都不能使用 null 作为其值。
import java.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface SimulatingNull { int id() default -1; String description() default "";}使用反射获取注解的方法流程图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android注解相关文章:AndroidAOP注解Annotation详解(一)AndroidAOP之注解处理解释器详解(二)AndroidAOP注解详解及简
AndroidAPO注解处理解释器相关文章:AndroidAOP注解Annotation详解(一)AndroidAOP之注解处理解释器详解(二)AndroidA
本文主要介绍Java中与注解和动态代理有关的部分知识,接下来我们看看具体内容。Annotation(注解)其实就是代码里的特殊标记,它用于替代配置文件,也就是说
Java注解介绍基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注:这是05年的文章,在2014年,毫无疑问,多人合作的开
Kotlin的注解类详解及实例注解声明注解是将元数据附加到代码的方法。要声明注解,请将annotation修饰符放在类的前面:annotationclassFa