getAnnotations 获取不到自定义注释的信息,求解

丶深蓝 发布于 2013/11/06 11:15
阅读 2K+
收藏 0
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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

public class TestAnnotation {

	@Test	//获取注释信息
	public void testGetAnnotationInfo() throws Exception{
		Class<?> clazz = new TestAnno().getClass();
		Annotation[] info = clazz.getMethod("testSun").getAnnotations();
		System.out.println(Arrays.asList(info));
	}
}

//自定义注释
@interface Sun{
	//定义成员变量使用方法的形式
	String name() default "aaa";	
	//使用default指定默认值
	int age() default 11;
}

@Sun(name="aaaaaaa")
class TestAnno{
	
	@Sun(name="Sun",age=23)	//测试自定义注释
	@SuppressWarnings("unchecked")
	@Before
	public void testSun(){
		System.out.println("aaaaaaaa");
	}
}
如代码所示,获取不到算定义的注释,只能获取Junit的注释信息
加载中
0
飞炀
飞炀

那你Sun的注解有没有加:

@Retention(value = RetentionPolicy.RUNTIME)

飞炀
飞炀
回复 @丶深蓝 : 最后回的贴已经说明白了,对于注释类可以进行4类注释,每种注释的含义都有,这是java5.0的标准定义。
丶深蓝
丶深蓝
试过了,真的可以啊!但是不知道什么原因
丶深蓝
丶深蓝
这个有什么作用?我今天刚学注解,很多还不明白
0
飞炀
飞炀
直接用clazz.getMethod("testSun").getAnnotation( Sun.class)获取指定的注解试一下。
丶深蓝
丶深蓝
试过了,也不行
0
飞炀
飞炀
Annotation 类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited,它们被用来提供对其它annotation类型作说明。 这些类型和它们所支持的类在java.lang.annotation包中可以找到。 
@Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 
ElementType.ANNOTATION_TYPE 应用于注释类型声明 
ElementType.CONSTRUCTOR 构造方法声明 
ElementType.FIELD 应用于字段声明(包括枚举常量) 
ElementType.LOCAL_VARIABLE 应用于局部变量声明 
ElementType.METHOD 应用于方法声明 
ElementType.PACKAGE 应用于包声明 
ElementType.PARAMETER 应用于参数声明 
ElementType.TYPE 应用于类、接口(包括注释类型)或枚举声明 
---------------------------------------------- 
@Retention的用法:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。 
RetentionPolicy.CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释 
RetentionPolicy.RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取 
RetentionPolicy.SOURCE 编译器要丢弃的注释 
----------------------------------------------- 
@Documented的用法:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。Documented是一个没有成员的注释。 
------------------------------------------------ 
@Inherited的用法:指示注释类型自动被子类继承。 Inherited也是一个没有成员的注释。 

注意,如果使用@Inherited注释类以外的任何事物都是无效的。还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。 

http://01404421.iteye.com/blog/568720

丶深蓝
丶深蓝
呵呵,多谢指定
返回顶部
顶部