这些Java注解有什么作用?

7
我仍然不清楚Java中注释的目的。最初,我认为它们只是用作文档。但是查看Google App Engine Datastore的文档后,我不太确定了。 @PersistenceCapable(identityType = IdentityType.APPLICATION) 看起来更像一个方法签名。
这种类型的注释有什么目的?它是做什么用的?
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String firstName;

    @Persistent
    private String lastName;

    @Persistent
    private Date hireDate;

    public Employee(String firstName, String lastName, Date hireDate) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.hireDate = hireDate;
    }

    // Accessors for the fields.  JDO doesn't use these, but your application does.

    public Long getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    } 

    // ... other accessors...
}
3个回答

9

它们是源级元数据。它们是一种向代码添加非代码信息的方式,并且很容易被机器处理。

在您的示例中,它们用于配置该实体类型的对象关系映射。它表示例如id字段应该是该对象的主键,并且firstName,lastName和hireDate应该存储在数据库中。(以区分这些字段与某些瞬态对象状态。)

GAE对JDO的支持需要知道您将尝试在数据库中存储哪些对象。它通过查看代码中的类来完成此操作,查找那些带有@PersistenceCapable注释的类。

通常,它们用于替换之前使用外部配置文件的位置; Java标准库具有读取代码中注释的工具,这使得它们比自己编写配置文件更容易处理,并免费获得IDE支持。


1
好的,那么这个类有点像是定义模型的一种简写方式。在旧日里,正如你所说,你可能会在Struts中有一个配置文件,使用文本符号来配置你的模型。但在这里,我们使用注释来做同样的事情。我猜测,注释的工作方式取决于你使用的库以及该库如何定义注释的工作方式。因此,在JDO库中,“@Persistent”可能意味着一件事,在其他某个库中可能意味着另一件事。 - Bijou
是的。例如在Hibernate中,您可以使用.hbm.xml文件或JPA注释来进行配置。一个库使用另一个库指定的注释是半常见的情况。在这种情况下,JDO是一个Java规范,有几个库支持/实现。因此,Google App Engine数据存储正在读取JDO注释。虽然它们具有不同的含义不太常见。当然,这是完全可能的,而且通过元数据(注释)比编程方式(调用某些方法)更容易实现。 - millimoose

1

0

我认为这些来自Java数据对象 API。它是一个与EJB3有一定重叠的API,具有相同的概念,但使用不同的语法和工具。

如果您对注释不熟悉,请查看Java教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接