2012-09-22 60 views
1

我正在写代码,其中数据库的表名必须根据我是否在我的开发环境或产品环境中进行更改。由于我使用的是Dynomo DB的高级API,表名被定义为注释。因此,例如是下面的代码可能的,什么是控制其行为的规则:注释绑定时间(当注释以Java绑定时)

static String postfix = "_test"; // (could be set to say _prod, _dev, etc.) 

@DynamoDBTable(tableName="sometable" + postfix) 
class MyTable { 
    ... 
    ... 

的问题集群这导致的是:

  1. 当在Java注释绑定?编译时间还是运行时间?
  2. 中途执行中可以更改绑定吗?

谢谢。

+1

它在编译时总是可用,因为编译需要编译它。根据它的RententionPolicy,它可以不在字节码,类字节码中,但在运行时不可用,或者在运行时也可用。 –

回答

1

java中的注释必须具有可在编译时解析的值。注释中不能有任何运行时信息,因为它是类定义本身的一部分。如果需要运行时信息,则必须由运行时正在查找注释的人来解决。

至于滞留,有3种形式保留的:

  1. 源 - 注释由编译器(通常用于提示和/或源代)被使用。示例包括@Override和@SuppressWarnings,并且在所有注释处理器都有机会看到它们之后被丢弃。 .class文件中没有记录。

  2. Class - 注解保存为.class文件本身的一部分,可用于解析类byte []数据(javassist等等)的工具,但不是实际的java的一部分加载的类对象。

  3. 运行时 - 批注可以从编译时一直到运行时作为java Class对象的一部分。

2

这取决于如何定义注释。 “保留”定义它是编译时还是运行时。使用java反射你可能会这样setAccessible(true);并在运行时设置注释