文档章节

JAVA annotation入门

Josean_Luo
 Josean_Luo
发布于 2014/06/08 19:03
字数 871
阅读 243
收藏 16

 最近对spring源码感兴趣,今天看到annotation部分,略记之。
一. 最常见的annotation
@Override:用在方法之上,用来告诉别人这一个方法是改写父类的
@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
@SuppressWarnings:暂时把一些警告信息消息关闭
@Entity :表示该类是可持久化的类
 
二. 设计一个自己的Annotation

      先看代码再讲话
1. 只有一个参数的Annotation实现

package chb.test.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;  
@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface MyAnnotation1 {  
        String value();  
}

 
 
2. 有两个参数的Annotation实现
 

package chb.test.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;  
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface MyAnnotation2 {  
        String description();  
        boolean isAnnotation();  
}


3. Annotation实验类

package chb.test.annotation;  
@MyAnnotation1("this is annotation1")  
public class AnnotationDemo {  
        @MyAnnotation2(description="this is annotation2",isAnnotation=true)  
        public void sayHello(){  
                System.out.println("hello world!");  
        }  
}

 
 
4.Annotation测试说明类
 

package chb.test.annotation;  
import java.lang.reflect.Method;  
import org.junit.Test;  
public class TestAnnotation {  
        @Test  
        public void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException{  
                Class<?> cls = Class.forName("chb.test.annotation.AnnotationDemo");  
                boolean flag = cls.isAnnotationPresent(MyAnnotation1.class);  
                if(flag){  
                        System.out.println("判断类是annotation");  
                        MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class);  
                        System.out.println(annotation1.value());  
                }  
                  
                Method method = cls.getMethod("sayHello");  
                flag = method.isAnnotationPresent(MyAnnotation2.class) ;  
                if(flag){  
                        System.out.println("判断方法也是annotation");  
                        MyAnnotation2 annotation2 = method.getAnnotation(MyAnnotation2.class);  
                        System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());  
                }  
        }  
          
}

 
实验结果,控制台打出如下信息:
 
判断类是annotation
this is annotation1
判断方法也是annotation
this is annotation2     true
 
三.简介及说明

 
1. MyAnnotation1中的@Target(ElementType.TYPE)
      @Target里面的ElementType是用来指定Annotation类型可以用在哪些元素上的.例如:
       TYPE(类型)、FIELD(属性)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造函数)、LOCAL_VARIABLE(局部变量),、PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上。
2. MyAnnotation1中的@Retention(RetentionPolicy.RUNTIME)
      RetentionPolicy 共有三种策略,分别为:
SOURCE:这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面
CLASS:这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这些信息加载到JVM中。注:默认策略为CLASS类型
RUNTIME:表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的
3. MyAnnotation1中的@Documented
目的就是将这一Annotation的信息显示在JAVA API文档上,如果没有增加@Documented的话,JAVA API文档上不会显示相关annotation信息
 
4. MyAnnotation1中的@interface
   关键字,表示该类为Annotation定义
5. MyAnnotation1中的 String value();
   表示有一个成员参数,名字为value,访问权为默认(default)修饰符,注意以下两点:
访问权只能用public和默认(default)修饰
参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组
6.AnnotationDemo中的@MyAnnotation1("this is annotation1")
   因为MyAnnotation1只有一个参数,因此可以直接在括号中写上value值。注:如果Annotation只有一个参数,则建议最好将该参数名称定义为value
7.TestAnnotation中的cls.isAnnotationPresent(MyAnnotation1.class)
    判断该类是否使用了MyAnnotation1的注释
8. TestAnnotation中的MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class)
    返回该类针对MyAnnotation1的注释
9. TestAnnotation中的method.isAnnotationPresent(MyAnnotation2.class)
    判断该方法是否使用了MyAnnotation2的注释

本文转载自:http://blog.csdn.net/hbcui1984/article/details/4735487

共有 人打赏支持
Josean_Luo
粉丝 7
博文 21
码字总数 5148
作品 0
广州
程序员
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
06/21
0
0
Java注解(Annotation)详解

Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may......

幻海流心
05/23
0
0
在linux上使用yum安装JDK

1.查找java相关得列表[root@localhost ~]# yum -y list java*Loaded plugins: fastestmirror, refresh-packagekit, securityLoading mirror speeds from cached hostfile base: mirrors.zju.......

罗荣熙
2015/05/04
0
0
Flask URL Mapping的注册方式。

由于先用的Java,然后现在学学python。 下面都是我根据我现在的知识来理解的。 Java中有annotation,Python中有decorator。用着感觉一样,原理还是不一样。 Java中的annotation类似于代码的注...

SwordHua
2013/10/04
0
0
Groovy 2.5.0 发布,JVM 动态脚本语言

Apache Groovy 2.5.0 已发布。此版本包含大量修复和依赖更新,并包含以下新特性: [GROOVY-6744] - Have the elvis operator (?:) support the Optional type in Java 8 [GROOVY-7089] - Bas......

淡漠悠然
05/31
0
1

没有更多内容

加载失败,请刷新页面

加载更多

腾讯三大运维开源项目齐聚“OSCAR开源先锋日”

10月20日,腾讯开源三大运维开源项目——TARS、蓝鲸和织云Metis首次集结,参与了由中国信息通信研究院主办、云计算标准与开源推进委员会承办的 “OSCAR开源先锋日”。会上,腾讯开源团队与前...

腾讯开源
24分钟前
1
0
JAVA并发-从缓存一致性说volatile 讲的很好

学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间。在进行运算的时候,CPU将需要的数据映射一份在缓存中,...

码代码的小司机
42分钟前
1
0
IDEA 调试功能

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序...

狼王黄师傅
50分钟前
1
0
Java面试170题

1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = ...

lanyu96
55分钟前
0
0
优雅的写出类

前言 虽然现在已经是ES6的时代,但是,还是有必要了解下ES5是怎么写一个类的。 本文详述JavaScript面向对象编程中的类写法,并分步骤讲述如何写出优雅的类。 一、例子 例子为一个轻提示组件T...

peakedness丶
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部