java的Annotation(注释)
2014-11-18 17:30
471 查看
//java.lang.annotation为 Java 编程语言注释设施提供库支持 import java.lang.annotation.ElementType;//ElementType程序元素类型。(枚举摘要) import java.lang.annotation.Retention;//指示注释类型的注释要保留多久。(注释类型摘要) import java.lang.annotation.RetentionPolicy;//注释保留策略。(枚举摘要) import java.lang.annotation.Target;//指示注释类型所适用的程序元素的种类。(注释类型摘要) /*java.lang.annotation,接口 Annotation。对于Annotation,是Java5的新特性, * JDK5引入了Metadata(元数据)很容易的就能够调用Annotations。 * Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误。 * An annotation 对代码的执行没有什么影响。 * Annotations使用@annotation的形式应用于代码: * 类(class),属性(attribute),方法(method)等等。 * 一个Annotation出现在上面提到的开始位置,而且一般只有一行,也可以包含有任意的参数。 * * 其实就是一个注释以@XX的形式出现,但是这个注释会被编译器编译并起到一定的作用。例如 * @Override指定方法覆盖,强调子类必须覆盖父类的方法,用于告诉编译器检查这个方法, * 保证父类要包含一个被该方法重写的方法否则报错(意思是这个方法写的和父类不同会报错避免打错字,打错了提醒你) * */ @Target(ElementType.METHOD)//指示注释类型所适用的程序元素的种类,ElementType.METHOD表示只能修饰方法定义。 @Retention(RetentionPolicy.RUNTIME) //指示注释类型的注释要保留多久,括号里的是形参。 /*下面的@interface是带成员变量的Annotation(注释) * Annotation的成员变量在Annotation定义中以无形参的方法形式来声明如下的无形参方法Comment * 其方法名和返回值定义了该成员变量的名字和类型 * */ public @interface Comment{ //定义了一个成员变量的Annotation String value(); }
小小一段代码加上详细的注释大略的反应出java的Annotation的两种声明方式
import java.util.Date;//导入的jar包,这是Date包,就可以使用里面的方法 /** * 有公司要求给所有属性都加上注释,我觉着所有可以望文生义的地方都不用加注释, * 注释不但加长了代码,造成一定的阅读障碍,而且废话般的注释根本就是浪费生命,浪费写注释的人的生命, * 更是浪费读代码的人的生命,看了半天,发现都是废话。 */ public class User { private Long id; private String username; private String password; private String realName; private String email; private Integer age;//原来java的整型是integer, private Integer gender; private Date birthday;//Date型的变量 birthday public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Comment(value="用户名")//一个Annotation public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } /** * 性别。 * @return */ public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } }
import java.lang.annotation.Annotation;//Annotation是所有 annotation 类型都要扩展的公共接口。(接口摘要) import java.lang.reflect.Method; /* * java.lang.reflect包下面有AnnotatedElement接口,该接口代表程序中可以接受注释的程序元素 * 该接口主要包括以下几个实现类:Class、Constructor、Field、Method(类的方法定义)、Package * 通过反射来获取某个类的AnnotatedElement对象(Class、Constructor、Field、Method、Package)之后 * 程序就可以调用该对象的如下3个方法里访问Annotation信息: * 1、getAnnotation(Class<T>annotationClass):返回该程序元素上存在的指定类型的注释,没有就返回null * 2、Annotation[]getAnnotation():返回该程序元素上的所有注释 * 3、boolean isAnnotationPresent(Class<?extends Annotation>annotationClass):判断该程序元素上是否存在指定类型的注释,存在就返回true,否则false * */ /*Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。 */ /** * annotation的使用实例。 * 请观察User类的getUsername,然后对比本代码打印的内容。 */ public class AnnotationTest { public static void main(String[] args) throws SecurityException, NoSuchMethodException { //获取getUsername方法(在User.java里面),然后列出其所有annotation的类型。 Method m = User.class.getMethod("getUsername"); Annotation[] annotations = m.getAnnotations(); //上面两句等同于Annotation[] annotations = Class.forname("User").getMethod("getUsername").getAnnotations(); //用于获得User类的getUsername方法的所以注释 System.out.println("1、getUsername方法有下属类型的注解:"); //遍历所有注释,annotation可以自己随意取名,annotations是上面的那个Annotation类型的数组名 for (Annotation annotation : annotations) { System.out.println(annotation.annotationType()); } //获取getUsername方法类型为Comment的annotation的value属性的值。 Comment commentAnnotation = m.getAnnotation(Comment.class); //获取Comment.java里面的注释 System.out.println("2、Comment注解的value属性的值为:commentAnnotation.value()="+commentAnnotation.value()); System.out.println("3、类定义上的annotation列表"); //获取类User里面所有的注释 Annotation[] classAnnotations = User.class.getAnnotations(); for (int i = 0; i < classAnnotations.length; i++) { Annotation a = classAnnotations[i]; System.out.println(a.annotationType().getName()); } } }
相关文章推荐
- 注释(@,annotation)在JAVA在用法
- Java1.5 new feature --- Annotation 注释
- Java中Annotation(注释)系列学习笔记(2)
- Java中Annotation(注释)系列学习笔记(1)
- 复习java第五天(枚举、Annotation(注释) 概述)
- 疯狂JAVA讲义---第十四章:Annotation(注释)
- 16. Java Annotation(注释)
- 黑马程序员--Java基础学习之内省(IntroSpector)、注释(Annotation)
- Java Annotation注释语法
- Java中Annotation(注释)系列学习笔记(3)
- Java Annotation注释语法
- java中的Java5.0 的注释 (Annotation)、多线程包1(J2SE入门25)
- java annotation 注释 简介
- Java中Annotation(注释)系列学习笔记(1)
- Java Annotation 注释语法
- Java Annotation注释语法
- Java Annotation注释语法[转】
- Java Annotation注释语法(元注释)
- Java中Annotation(注释)系列学习笔记(4)
- Java中Annotation(注释)系列学习笔记(4)