文档章节

java annotation注解

Yohance
 Yohance
发布于 2015/07/13 22:43
字数 1000
阅读 25
收藏 0
第一部分:了解一下java1.5起默认的三个annotation类型:  
   一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。 
   一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上. 

   一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭. 


 第二部分:讲一下annotation的概念先,再来讲一下怎样设计自己的annotation. 
   首先在jdk自带的java.lang.annotation包里,打开如下几个源文件: 

1.@Target此注解的源码如下,注解中有个ElementType 经查看源码是个枚举类型

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}
2. ElementType是@Target中的一个枚举类型,主要用来声明注解的地方是  TYPE(类,接口...) ,FIELD(属性),METHOD(方法),PARAMETER(参数),CONSTRUCTOR(构造方法)

LOCAL_VARIABLE(局部变量) ANNOTATION_TYPE(注解),PACKAGE(包)

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}
3.@Retention
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}
4.RetentionPolicy

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

RetentionPolicy这是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME. 
   SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。 
   ClASS的意思是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS. 
   RUNTIME,表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的. 
  举一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息;相反,@Deprecated里面的Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被Deprecated. 

由此可以看出@Retention是干嘛用的了吧 ?

另附:@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息. 
   另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型. 
第三部分:下面讲的设计一个最简单的Annotation例子; 

package com.yun.study.webdemo.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;

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassDescription {
	String desc();
	String fmtDesc();
}

package com.yun.study.webdemo.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;

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@ClassDescription(desc="自定义方法上的注解类",fmtDesc="[自定义方法上的注解类]")
public @interface MyMethodAnno {
	String modifier();
	String returnType();
}


package com.yun.study.webdemo.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;

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@ClassDescription(desc="自定义属性注解类",fmtDesc="[自定义属性注解类]")
public @interface MyFiledAnno {
	/**
	 * 属性类型
	 */
	String filedType();
	
}

package com.yun.study.webdemo.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestAnno {
	public static void main(String[] args) throws Exception {
		Class user = Class.forName("com.yun.study.webdemo.model.User");
		
		boolean isAnnoDesc = user.isAnnotationPresent(ClassDescription.class);
		
		if(isAnnoDesc){
			ClassDescription des = (ClassDescription) user.getAnnotation(ClassDescription.class);
			System.out.println("Description des:"+des.desc());
			System.out.println("Description fmtdes:"+des.fmtDesc());
			System.out.println("=============================================");
		}
		Method[] ms = user.getMethods();
		for(Method m : ms){
			MyMethodAnno myMethod = m.getAnnotation(MyMethodAnno.class);
			if (myMethod==null) continue;
			String modifier = myMethod.modifier();
			String rtype = myMethod.returnType();
			System.out.println("MyMethodAnno modifier:"+modifier);
			System.out.println("MyMethodAnno returnType:"+rtype);
		}
		System.out.println("=============================================");
		Field[] fs = user.getFields();
		for(Field f : fs){
			MyFiledAnno myFiled = f.getAnnotation(MyFiledAnno.class);
			if (myFiled==null) continue;
			String filedType = myFiled.filedType();
			System.out.println("MyFiledAnno filedType:"+filedType);
		}
	}
}
测试类输出信息如下:

Description des:用户信息描述类
Description fmtdes:[格式化的用户信息描述]
=============================================
MyMethodAnno modifier:public
MyMethodAnno returnType:String
=============================================
MyFiledAnno filedType:Long
MyFiledAnno filedType:String













版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/u011700318/article/details/38585897

共有 人打赏支持
Yohance
粉丝 14
博文 82
码字总数 44971
作品 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......

幻海流心
2018/05/23
0
0
深入理解注解(Annotation)

在现在的开发中,注解越来越多地应用到了开发中,无论是Servlet3.0新特性,还是SSH中的全注解,都给开发带来了极大的便利, 直观. 因此需要对注解有深入的理解. 一. 自定义注解 自定义注解的目...

长平狐
2012/09/03
113
0
Annotation(注解) 学习

一,Annotation(注解) 概述 ,Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何...

宇宙执政
2014/05/07
0
0
深入浅出Java Annotation(元注解和自定义注解)

一、基本概述    Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)...

引鸩怼孑
2015/07/13
0
0
play2.0文档-面向java开发者(6)

Action composition Action组合 This chapter introduces several ways to define generic action functionality. 这章节介绍几个定义通用action功能的方式。 Reminder about actions actio......

老盖
2012/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

重磅发布:阿里 OpenJDK终于开源啦! 将长期支持版本 Dragonwell

前几天的北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell。作为 Java 全球管理组织 Java Community Process (JCP) 的最高执行委员会的唯一中国代表,以及...

终端研发部
33分钟前
4
0
十年再出发!阿里云智能总裁张建锋演讲全记录

3月21日,“十年再出发”阿里云峰会于国家会议中心正式召开。阿里云智能总裁张建锋(行癫)携核心管理团队首次悉数亮相,并对阿里云做了全面的战略解读。以下是演讲全文。 张建锋:今天是我们...

阿里云官方博客
33分钟前
2
0
vue实现通告文字向下推动效果

<!--一定保证key的唯一性--><div class='box'><transition-group name="list" tag="div" mode="out-in" ><div v-for="item in items" v-bind:key="item" class="list-item">{{ item }......

Js_Mei
37分钟前
1
0
如何自学编程?学习方法在这里!

如何自学编程?学习方法在这里! 目前工作4年,当初是自学安卓的,资料网上整理的都非常全面了,我想补充的是现在已经不是当初资料匮乏的时代了,免费课程,付费课程,技术博客真的太多了,所...

Mr_zebra
51分钟前
1
0
Cloud 团队:让 TiDB 在云上跳舞 | PingCAP 招聘季

TiDB 是 Cloud Native 的数据库,对于 TiDB 来说,如何用 Cloud 的思想和技术让 TiDB 在云上跳舞,是 Cloud 团队研究的重要课题,本期我司商业产品副总裁刘寅老师将为大家介绍 Cloud 团队,E...

TiDB
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部