当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

自定义注解

发表于: 2013-08-30   作者:chinrui   来源:转载   浏览次数:
摘要: 自定义注解 1、最简单的自定义注解 package annotation; public @interface HpuAnnotation { // 注解相当于一个特殊的类型,与Enum 、 Interface类似 } 2、测试自定义的注解 package annotation; @HpuAnnotation public class AnnotationTe
自定义注解

1、最简单的自定义注解
package annotation;

public @interface HpuAnnotation {
	// 注解相当于一个特殊的类型,与Enum 、 Interface类似
}

2、测试自定义的注解
package annotation;

@HpuAnnotation
public class AnnotationTest {

	public static void main(String[] args) {
		
		// 判断AnnotationTest 是否添加了HpuAnnotation注解
		if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) {
			// 获取AnnotationTest上面相应的注解 
			HpuAnnotation annotation =
                        AnnotationTest.class.getAnnotation(HpuAnnotation.class);
			// 打印注解信息
			System.out.println(annotation);
		}
	}
}

运行结果 :   不输出任何信息
原因:自定义注解有有三种保留策略:
  • --RetentionPolicy.CLASS    
  • --RetentionPolicy.RUNTIME
  • --RetentionPolicy.SOURCE

java语句执行的过程中包括三个阶段,第一个阶段是源文件阶段,即.java文件阶段;第二个阶段是Class阶段,即由源文件编译形成.class文件;第三个阶段是运行阶段,即由类加载器将.class文件加载进入内存,形成字节码的阶段。而自定义注解的默认保留策略为:class阶段,即.class文件里面有注解的信息,但是将.class文件加载进入内存的时候,会忽略掉注解信息。
If no Retention annotation is present on an annotation type declaration, the retention policy defaults to RetentionPolicy.CLASS.
故在自定义的注解上加上注解@Retention(RetentionPolicy.RUNTIME)设定保留策略后,就可以得到想要的结果了。
运行结果为:@annotation.HpuAnnotation()
3、在自定义注解上添加注解 @Target(value=ElementType.METHOD) 可以设定自定义注解的使用位置
  • --METHOD     只能加在方法上
  • --TYPE        只能加在类上
  • --CONSTRUCTOR    只能加在构造方法上
  • --FIELD     只能加在字段上
  • --LOCAL_VARIABLE    只能加在局部变量上
  • --PACKAGE 加在包上面
  • --PARAMETER 加在参数上面
  • --ANNOTATION_TYPE 注释类型声明

4、给自定义注解添加属性,在注解里面属性的存在形式为方法,属性值与返回值的类型一样。注解里面所有方法的默认类型为public abstract 类型的。如下(给注解添加一个属性color,其值的类型要求是String):
// 注解相当于一个特殊的类型,与Enum 、 Interface类似
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
public @interface HpuAnnotation {
	// 属性名:color 属性值类型:java.lang.String
	String color();
}

测试方法:
@HpuAnnotation(color="red")
public class AnnotationTest {

	public static void main(String[] args) {
		
		// 判断AnnotationTest 是否添加了HpuAnnotation注解
		if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) {
			// 获取AnnotationTest上面相应的注解 
			HpuAnnotation annotation = AnnotationTest.class.getAnnotation(HpuAnnotation.class);
			// 获取注解中属性的值,获取方式通过调用相应的方法
			System.out.println(annotation.color());
		}
	}
}

设置默认属性值:
// 属性名:color 属性值类型:java.lang.String
String color() default "blue";

当属性名为value的时候,且只需要设定value属性的时候,可以不用写value=,而直接在注解后面写上值即可。
@MetaAnnotation("wcj")


5、属性的多种值类型
自定义枚举类型,用于作为注解属性值类型:
public enum Color {
	RED,GREEN,YELLOW
}

自定义注解类型,用于作为注解属性值的类型:
public @interface MetaAnnotation {
	String value();
}

自定义的多种属性值注解:
// 注解相当于一个特殊的类型,与Enum 、 Interface类似
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
public @interface HpuAnnotation {
	// 属性名:color 属性值类型:java.lang.String
	String color() default "blue";
	// 属性名:enumColor 属性值类型:Enum
	Color enumColor();
	// 属性名:array 属性值类型:int[]
	int[] array();
	// 属性名: annotation 属性值类型:@interface
	MetaAnnotation annotation() default @MetaAnnotation("wcj");
}

测试各种属性值类型:
@HpuAnnotation(enumColor=Color.GREEN,array={1,2,3},annotation=@MetaAnnotation("xy"))
public class AnnotationTest {

	public static void main(String[] args) {
		
		// 判断AnnotationTest 是否添加了HpuAnnotation注解
		if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) {
			// 获取AnnotationTest上面相应的注解 
			HpuAnnotation annotation = AnnotationTest.class.getAnnotation(HpuAnnotation.class);
			// 获取注解中属性的值,获取方式通过调用相应的方法
			System.out.println(annotation.color());
			// 获取属性值类型为Enum
			System.out.println(annotation.enumColor());
			// 获取属性值类型为int[]
			int[] arr = annotation.array();
			System.out.print("[");
			for(int i = 0; i < arr.length; i++) {
				if(i != arr.length - 1) {
					System.out.print(arr[i] + ",");
				} else {
					System.out.print(arr[i]);
				}
			}
			System.out.println("]");
			// 获取属性值类型为@interface
			System.out.println(annotation.annotation());
		}
	}
}

运行结果:
blue
GREEN
[1,2,3]
@annotation.MetaAnnotation(value=xy)

自定义注解

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一.注解术语 http://zy19982004.iteye.com/blog/1979039里把注解里的术语罗列了一遍,未做深入解读
  之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@Suppr
1、自定义注解 package com.ljb.app.annotation;// 复制到bin目录下时这个包得删去 import java.lan
  之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@Suppr
Spring3.0中加入了对缓存的注解支持,即当你使用ehcache时可以使用例如@cachable等注解,这十分方便
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要
注解的作用: 1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return
8 注解
1、基本概念 注解(也被称为元数据)在代码中添加信息提供了一种形式化的方法,使可以在稍后某个时
转载:http://itindex.net/detail/50710-springaop-controller-service 从业近二,三年了,第一次写
1. 前言 自JDK1.5以后,推出了注解新特性。注解的推出其实最主要的目的是为了让广大的用户认知EJB3.
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号