在以下这篇文章中,已经定义了三个注解:@Programmer、@ConstructorNote和@Common:
接下来就可以在其他类中使用这三个注解。例程1的Person类就利用它们对类、构造方法、成员变量、成员方法和参数做注解。
例程1 Person.java
@Programmer(name="Jack",company="PowerNode")
public class Person{
@Common(type=String.class,description="姓名")
private String name;
@Common(type=int.class,description="年龄")
private int age;
@ConstructorNote
public Person(){
this("unknown",0);
}
@ConstructorNote("带参数的构造方法")
public Person(
//注解构造方法的参数
@Common(type=String.class,description="姓名")String name,
@Common(type=int.class, description="年龄")int age){
this.name=name;
this.age=age;
}
@Common(type=String.class,description="获得姓名")
public String getName(){
return name;
}
@Common(type=int.class,description="获得年龄")
public int getAge(){
return age;
}
@Common(description="设置姓名")
public void setName(
@Common(type=String.class,description="姓名")
String name){
this.name=name;
}
@Common(description="设置年龄")
public void setAge(
@Common(type=int.class,description="年龄")
int age){
this.age=age;
}
}
在Person类的源代码中,在类的前面使用了@Programmer注解,在构造方法前使用了@ConstructorNote注解,在成员变量、成员方法和参数前使用了@Common注解。
在为注解的成员赋值时,有以下几种方式:
(1)注解的成员使用默认值,例如:
@ConstructorNote //该注解的value成员使用默认值
public Person(){
this("unknown",0);
}
(2)以“成员名=成员值”的形式为成员赋值,例如:
@Common(type=String.class,description="姓名")
private String name;
(3)当注解只有一个成员,并且成员的名字为value时,可以直接以“成员值”的形式为成员赋值,例如:
@ConstructorNote("带参数的构造方法") //为该注解的value成员赋值
public Person(……){……}
在编译Person类时,由于它所引用的三个自定义注解的有效范围都是RetentionPolicy.RUNTIME,因此编译器会把这些注解编译到Person类的类文件中。
在定义@Programmer注解时引用了JDK类库的内置@Documented注解:
// 定义@Programmer注解
import java.lang.annotation.*;
@Documented
@Target({ElementType.TYPE}) //适用于类和接口
@Retention(RetentionPolicy.RUNTIME) //有效范围是运行时
public @interface Programmer{
String name(); //程序员姓名
String company(); //程序员所在单位
}
因此用JDK的javadoc命令为Person类生成的JavaDoc文档中,会包含@Programmer注解信息。
Person类的JavaDoc文档中的@Programmer注解信息
上文参考孙卫琴的经典Java书籍《Java面向对象编程》