您的位置:首页 > 编程语言 > Java开发

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());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: