摘要:的在日常开发,特别是开发中使用广泛,各种框架,测试框架多多少少都会引入一些注解。的功能是作用于程序元数据的特殊类型。而在编译期使用注解则需要特殊的工具,本文不讨论。可以看到通过类中的反射方法获取到了这个类的注解以及其方法的注解。
Java的Annotation在日常开发,特别是java web开发中使用广泛,各种web框架,测试框架多多少少都会引入一些注解。若对java注解有一个全面深入的了解,对于我们的开发工作会有很大的帮助。
Annotation的功能Annotation是作用于java程序元数据的特殊类型。本身和程序的逻辑隔离,程序的运行逻辑不会被Annotation影响。因此,Annotation在程序中的作用仅限于提供一种信息,定义Annotaiton时即把这种信息和被Annotation修饰的class,method,package等关联了起来。感兴趣的外部程序(如编译器,运行时检查系统,框架,工具等)即可通过反射机制从被修饰类型上获取到关联的Annotation,从而实现特殊的功能。因此可以说Annotaion是一种特殊的注释,是给框架,编译器,运行时检查系统等外部系统看的注释。
Anntation可以在运行时使用,也可以在编译时使用。在运行时,Annotation是class类的一部分,获取Annotation信息需要通过Class对象。而在编译期使用注解则需要特殊的工具,本文不讨论。
定义AnnotationAnnotation是java中一种独立的类型,用@interface声明,且继承了Annotation接口。定义一个Annotation的目的无非是想注明一个类,一个field,乃至一个package拥有某项信息。因此Anntation的定义是非常轻量的,唯一要做的也只是定义在@interface体中定义一些name value对,定义形式类似于没有方法体的方法。这些name可以有默认值也可以没有默认值。Annotation的域可以使用8种基本类型和class,Enum等类型,例如下面代码所示:
@interface TestAnnotation{ public String testNmae(); public String testNameValue() default "test"; public int testIntName() default 10; }
此外,Annotation定义时需要采用一些元注解来指定注解的属性,这些元注解作用于自定义注解,指定了自定义注解的可见范围,作用对象,是否可继承等属性,具体可见https://docs.oracle.com/javas...。
@Retention @Target @Documented @Inherited @Repeatable使用Annotation
Annotation的使用包括在编译时使用和运行时使用,编译时使用需要Annotation工具,此文不讨论,在运行时使用需要用反射方法去获取注解信息,然后根据获取到的注解信息做自定义的处理。
处理Anntation和反射应用一样。首先获取需要处理的类或者方法等的Class对象,再用isAnnotationPresent方法检测指定的Anntation类型是否注解了该类,也可以用Class对象的getAnnotation方法获取到指定的Anntation对象。
代码清单1.1是一个简单的Annotation使用示例。
//1.1 // Description.java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface Description{ String value(); } //AnnotationTest.java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface AnnotationTest{ String name(); } //ClassWithAnnotation.java @Description("this is a class with description annotation") public class ClassWithAnnotation { @AnnotationTest(name="this is a method with annotation") public void doSth(){ System.out.println("i have a annotation"); } } //AnalysisAnnotation .java public class AnalysisAnnotation { public static void main(String[] args){ try{ Class> rtClass = Class.forName("annotation.ClassWithAnnotation"); Method[] methods = rtClass.getMethods(); boolean desctionExist = rtClass.isAnnotationPresent(Description.class); if(desctionExist){ Description description = rtClass.getAnnotation(Description.class); System.out.println("class"s annotation value:"+description.value()); for(Method method:methods){ if(method.isAnnotationPresent(AnnotationTest.class)){ AnnotationTest annotation = method.getAnnotation(AnnotationTest.class); System.out.println("method"s anntation value:"+annotation.name()); } } } } catch(ClassNotFoundException e){ e.printStackTrace(); } } }
运行结果如上。可以看到通过AnalysisAnnotation类中的反射方法获取到了ClassWithAnnotation这个类的注解以及其方法的注解。编译时代码即可这样获取到注解信息,加以利用。运行时注解的一个常见例子是junit等测试框架,或根据注解来实现一些功能。
除了运行时可以使用注解,在编译时也可以用注解,这个需要特殊的工具支持。常用来自动生成代码。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64669.html
摘要:但是模块化当中,无法扫描只有模块中可以使用有两种解决方案定义一个专门的资源模块,并使用提供的接口,实现它,并将这个实现注册为服务。有两种方式使用或包名,包名模块名使用运行时动态。 模块设计的原则: 1、防止出现编译时循环依赖(主要是编译器不支持),但运行时是允许循环依赖的,比如GUI应用2、明确模块的边界 几种模块设计: API模块,聚合模块(比如java.base) 可选依赖 两种方...
摘要:项目介绍日志脱敏是常见的安全需求。特性基于注解的日志脱敏可以自定义策略实现,策略生效条件常见的脱敏内置方案深拷贝,且原始对象不用实现任何接口。放在集合属性上,且属性为普通对象作为演示,集合中为普通的字符串。 项目介绍 日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。 用户也可以...
阅读 1562·2023-04-25 22:42
阅读 2167·2021-09-22 15:16
阅读 3434·2021-08-30 09:44
阅读 455·2019-08-29 16:44
阅读 3277·2019-08-29 16:20
阅读 2481·2019-08-29 16:12
阅读 3359·2019-08-29 16:07
阅读 636·2019-08-29 15:08