silverghost

世界可以想象,世界可以创造

Avatar

Java Annotations-1

Java 标注 (Annotations)
维基百科,自由的百科全书

Java标注是Java语言5.0版本开始支持加入源代码的特殊语法元数据[1]。

Java语言中的类、方法、变量、参数和包等都可以被标注。Java标注和Javadoc不同,标注有自反性。在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注[2]。


[编辑] 实例

// @Twizzle标注toggle()方法。
@Twizzle
public void toggle() {
}

// 声明Twizzle标注
public @interface Twizzle {
}

标注可以包括一个关键字和值的对构成的列表:

//等同于 @Edible(value = true)
@Edible(true)
Item item = new Carrot();

public @interface Edible {
boolean value() default false;
}

@Author(first = "Oompah", last = "Loompah")
Book book = new Book();

public @interface Author {
String first();
String last();
}

标注声明中可以用标注说明使用方式、时间和对象:

@Retention(RetentionPolicy.RUNTIME) // 该标注可以在运行时通过反射访问。
@Target({ElementType.METHOD}) // 该标注只用于类内方法。
public @interface Tweezable {
}

编译器保留一组标注用于特定语法目的 (包括 @Deprecated, @Override和@SuppressWarnings等)。

标注通常用于软件框架为用户定义的类和方法提供引用外部资源的情形,如XML配置文件、事务环境等。以下是一个标注过的EJB 3.0的类:

@Entity // 声明实体类
@Table(name = "people") // 映射该类到 "people"表
class Person implements Serializable {
@Id // 映射到主键
@GeneratedValue(strategy = GenerationType.AUTO) // 数据库自动生成键值
private Integer id;

@Column(length = 32) // 限长32个字符
private String name;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

以上代码中标注不执行任何特定行为,而是为在运行时,EJB容器获得足够的信息,生成对象到关系数据库的映射。