java---Annotation
2013-08-07 13:31
225 查看
package senssic.demo; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; import java.util.ArrayList; /** * jdk1.5后增加的新特性,使用注释的方式加入一些程序信息,java.lang. * java.lang.annotation.Annotation接口是所有Annotation必须实现的接口,默认的隐式实现,可以被类或抽象类实现可以被继承,但本身不能继承其他接口 */ enum MyEnum { 大一, 大二, 大三, 大四; } /** * 自定义annotation */ // 使用Retention定义一个Annotaion保存的范围,其中有个RetentionPolicy枚举表示保存的范围, // SOURCE:此Annotaion类型的信息只会保留在源程序文件中.java // CLASS:此Annotation类型的信息会保留在.java和.class文件中,但不会被加载到虚拟机中,如果annotation没有声明指定范围则默认此范围 // RUNTIME|:此Annotaion类型信息会保留在.java和.class文件以及虚拟机(jvm)中,一直会在执行时候起作用 @Retention(RetentionPolicy.RUNTIME) // 使用Target指明此annotation的使用地方,使用的是ElementType枚举 // ANNOTATION_TYPE:使用在annotation上 // CONSTRUCTOR:使用在构造方法上 // FIELD:使用在字段上(包括枚举常量) // LOCAL_VARIABLE:使用在局部变量上 // METHOD:使用在方法上 // PACKAGE:使用在包上 // PARAMETER:使用在参数上 // TYPE: 使用在类、接口(包括注释类型)或枚举声明上 @Target(value = { ElementType.TYPE, ElementType.METHOD }) @interface MyAnnotation {//方法必须是无参且不抛异常,返回值只能是原始类型,Class类型,枚举类型,不能是除此之外的其他数据引用 public String name(); public int age() default 20;// 可以设置默认值,但默认值不能为null public String[] location();// 可以是数组 public MyEnum myEnum();// 可以是枚举 } class A { public void p() { System.out.println("父类A的方法!"); } public <T> void pp(T t) { System.out.println("泛型:" + t); } } /** * 系统内建的Annotation:@Override:表示覆写的正确性@Deprecated:表示本身不建议使用的操作@SuppressWarnings * :用于压制警告信息,即不再显示警告编译 */ @MyAnnotation(location = { "池州", "阜阳" }, myEnum = MyEnum.大三, name = "senssic") class B extends A { // 此方法将无安全警告(此处为泛型安全警告) @SuppressWarnings("rawtypes") // 此方法不建议使用 @Deprecated // 此方法为覆写 @Override @MyAnnotation(location = { "中国", "安徽" }, myEnum = MyEnum.大四, name = "qiyu") public void p() { ArrayList aList = new ArrayList(); } } public class AnnotationClass { /** * Annotation工作原理:解析annotation---通过反射获取Annotation( * 此时Annotation必须是RUNTIME范围的annotation) * 的相应信息,相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素, * 或改变他们的行为,annotation不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // 使用反射获得类上的Annotation,反射只能得到范围是RUNTIME的annotation,如果想操作其他范围内的可以使用apt Class c = null; try { c = Class.forName("senssic.demo.B"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("类上的Annotation"); for (Annotation ann : c.getAnnotations()) { System.out.println(ann.toString()); } Method method = c.getMethod("p"); System.out.println("方法上的Annotation"); for (Annotation ann : method.getAnnotations()) { System.out.println(ann.toString()); } } }
运行结果:
类上的Annotation
@senssic.demo.MyAnnotation(age=20, location=[池州, 阜阳], myEnum=大三, name=senssic)
方法上的Annotation
@java.lang.Deprecated()
@senssic.demo.MyAnnotation(age=20, location=[中国, 安徽], myEnum=大四, name=qiyu)
相关文章推荐
- (转)Java 标注(Annotation)详解
- 深入理解Java:注解(Annotation)基本概念
- Java基础加强总结(一)——注解(Annotation)
- java之初涉注解(Annotation)
- sphinx 中的注解,及java Annotation 总结
- Java Annotation入门
- 回顾java Annotation(注解)
- Java基础之理解Annotation
- 深入理解Java:注解(Annotation)自定义注解入门
- 深入理解Java:注解(Annotation)自定义注解入门
- 深入理解Java:注解(Annotation)基本概念
- Java自定义Annotation的应用(注解@)
- 深入理解Java:注解(Annotation)--注解处理器
- Java自定义注解Annotation详解
- java-annotation的简单介绍
- AnnotationTransactionAttributeSource is only available on Java 1.5 and higher
- Java注解(Annotation)详解
- AnnotationTransactionAttributeSource is only available on Java 1.5 and higher
- Java Bean Annotation Constraint Validation 未完待续
- Java Annotation 入门