`

annotation

    博客分类:
  • java
阅读更多

    在使用 JUnit4 中,我们可以看到在每个测试方法前面都有一个 @Test 标记,这就是传说中的 Annotation 
    
Annotation 提供了一条与程序元素关联任何信息或者任何元数据( metadata )的途径。从某些方面看, annotation 就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在 annotation “name=value” 结构对中。 annotation 类型是一种接口,能够通过 java 反射 API 的方式提供对其信息的访问。
    
annotation 能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息。需要注意的是,这里存在着一个基本的潜规则

      annotaion 不能影响程序代码的执行,无论增加、删除 annotation ,代码都始终如一的执行。另外,尽管一些 annotation 通过 java 的反射 api 方法在运行时被访问,而 java 语言解释器在工作时忽略了这些 annotation 。正是由于 java 虚拟机忽略了 annotation ,导致了 annotation 类型在代码中是 不起作用 的;只有通过某种配套的工具才会对 annotation 类型中的信息进行访问和处理。
    
 annotation 是与一个程序元素相关联信息或者元数据的标注。它从不影响
ava 程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产生影响。
    
我的理解是:

Annotation 是继承自 java.lang.annotation.Annotation 的类,用于向程序分析工具或虚拟机提供 package class field methed 等方面的信息,它和其他类没什么区别 , 除了使用方式。
    下面写了一个简单的Annotation:WorkerPOJOAnnotation.java

package com.xpec.landon.trainjava.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 修饰WorkerPOJO类方法的一个Annotation
 * @author lvwenyong
 *
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WorkerPOJOAnnotation {
 String name();
 int age();

}

    其中 @Target 里面的 ElementType 是用来指定 Annotation 类型可以用在哪一些元素上的,包括 TYPE (类型), METHOD (方法), FIELD (字段), PARAMETER (参数)等。其中 TYPE 是指可以用在 Class,Interface 等类型上。下面给出用 jad 反编译 出的 ElementType 中的静态变量的截图:

    另外 @Retention 中的 RetentionPolicy 是指 Annotation 中的信息保留方式, 分别是 SOURCE,CLASS RUNTIME. SOURCE 代表的是这个 Annotation 类型的信息只会保留在程序源码里,源码如果经过了编译之后, Annotation 的数据就会消失 , 并不会保留在编译好的 .class 文件里面。 ClASS 的意思是这个 Annotation 类型的信息保留在程序源码里 , 同时也会保留在编译好的 .class 文件里面 , 在执行的时候,并不会把这一些信息加载到虚拟机 (JVM) 中去 . 注意一下,当你没有设定一个 Annotation 类型的 Retention 值时,系统默认值是 CLASS. 第三个 , RUNTIME, 表示在源码、编译好的 .class 文件中保留信息,在执行的时候会把这一些信息加载到 JVM 中去的.
    下面给出用 jad 反编译出的 RetentionPolicy 中的静态变量的截图
    
    最后的一个 Annotation@Documented 是指目的就是让这一个 Annotation 类型的信息能够显示在 Java API 说明文档上。

    下面将上面自己设计的 WorkerPOJOAnnotation 应用在了 WorkerPOJO 类的一个方法前面:
    然后在控制台输出了没有被 Annotation 注释的字段和方法,运行后可以看到不包括 getName 方法。
    最后我们可以用Junit4 书写一个测试用例: POJOReflectionJunit4Test .java

package com.xpec.landon.trainjava.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.activation.FileDataSource;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * 关于Java反射以及Annotation的一个TestCase
 * @author lvwenyong
 *
 */

public class POJOReflectionJunit4Test {
 private Class pojo;
 private Field []fieldList;
 private Method[] methodList;

 @Before
 public void setUp() throws Exception {
  //加载类WorkPOJO
  pojo = Class.forName("com.xpec.landon.trainjava.annotation.WorkerPOJO");
  //获取域的数组
  fieldList = pojo.getDeclaredFields();
  //获取方法的数组
  methodList = pojo.getDeclaredMethods();
 }
 
 //测试字段和方法的个数
 @Test
 public void testSize()
 {
  Assert.assertEquals(2, fieldList.length);
  Assert.assertEquals(4, methodList.length);
 }

 //测试字段是否带有annotations
 @Test
 public void isFieldAnnotation()
 {
  for(int i = 0;i < fieldList.length;i++)
  {
   Assert.assertEquals(false, fieldList[i].isAnnotationPresent(WorkerPOJOAnnotation.class));
  }
 }
 
 //测试方法是否带有annotations
 @Test
 public void isMethodAnnotation()
 {
  for(int i = 0;i < methodList.length;i++)
  {
   Assert.assertEquals(false, methodList[i].isAnnotationPresent(WorkerPOJOAnnotation.class));
  }
 }
 
 @After
 public void tearDown() throws Exception {
 }

}

分享到:
评论

相关推荐

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    geronimo-annotation_1.0_spec-1.1.1-API文档-中文版.zip

    赠送jar包:geronimo-annotation_1.0_spec-1.1.1.jar; 赠送原API文档:geronimo-annotation_1.0_spec-1.1.1-javadoc.jar; 赠送源代码:geronimo-annotation_1.0_spec-1.1.1-sources.jar; 赠送Maven依赖信息文件:...

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    mybatis-plus-annotation-3.2.0-API文档-中英对照版.zip

    赠送jar包:mybatis-plus-annotation-3.2.0.jar; 赠送原API文档:mybatis-plus-annotation-3.2.0-javadoc.jar; 赠送源代码:mybatis-plus-annotation-3.2.0-sources.jar; 赠送Maven依赖信息文件:mybatis-plus-...

    javax.annotation-api-1.2-API文档-中英对照版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    javax.annotation-api-1.3.2

    JDK9及以上版本没有javax.annotation-api-***.jar包 ,无法使用注解:@Resource JDK新特性,高版本JDK没有自带的javax(java扩展包)了。或者是使用的JDK不完整。 下载javax.annotation.jar包,导入到lib文件夹下,...

    javax.annotation-api-1.3.2-API文档-中英对照版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 包含翻译后的API文档:javax.annotation-api-...

    javax.annotation.jar文件

    spring 注解初始化,初始化开始@postconstruct 对象销毁@predestroy javax.annotation.jar文件

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    详解 Spring 3.0 基于 Annotation 的依赖注入实现。。详解 Spring 3.0 基于 Annotation 的依赖注入实现。。

    Annotation注解的介绍和使用

    1.Annotation注解的介绍和使用

    完整的android.support.annotation

    完整的android.support.annotation.jar包含Nullable、Keep、XmlRes、TransitionRes、WorkerThread等共49个类

    point-cloud-annotation-tool

    github链接链接:https://github.com/springzfx/point-cloud-annotation-tool 在windows平台编译完成后的exe和dll文件,可以直接打开使用,并对原项目进行了优化,增加了列表和标注文件的显示功能,标注起来更快,...

    jar包_javax.annotation.zip

    文件中包含javax.annotation的jar包,用来解决@Resource注解无法导入依赖。Resource注解无法导入依赖使用javax.annotation的注解类,这是他的jar包。

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    androidx-annotation-1.2.0.jar

    androidx-annotation-1.2.0.jar

    Spring注释 注入方式源码示例,Annotation

    花了些时间做了一个实验,彻底弄懂了spring Annotation注入的方式。凡带有@Component,@Controller,@Service,@Repository 标志的等于告诉Spring这类将自动产生对象,而@Resource则等于XML配置中的ref,告诉spring此处...

Global site tag (gtag.js) - Google Analytics