2011-12-01 88 views
1

我想使用关键字符串上的注释来配置该关键字属性的初始值。例如,如何在Java注释参数中接受多种类型?

@NodeProperty(initialValue = "bar") static final String "FOO"; 

其他代码后处理注释,增加一键“FOO”与价值“酒吧”到特定的key-value存储,如果key“FOO”已经不存在。

我的注释声明:

@Retention(RetentionPolicy.RUNTIME) 
@interface NodeProperty { 
    long initialValue(); // I want to accept Strings, ints, byte[], etc. here. 
} 

但是,我不知道initialValue时间提前的类型。我想接受所有的基元,字符串和这些数组。

有关如何完成此任何想法?

编辑:

不幸的是,这听起来像超载注释参数目前还不可能。下面的答案包含各种解决方法。

+1

接受一个'Object'? – talnicolas

+0

编译器不允许这样做,因为注释参数类型必须是原始类,类,字符串,枚举或这些的数组。即使是基元的对象版本也是不允许的。 –

+0

这不是一个类型问题,而是一个“编译时常量”问题,我想。 –

回答

2

接受单一类型(可能为String),并使用类型转换将它从你所得到的领域中获得。与Commons BeanUtils或XWork允许注册类型转换器从字符串表单值到任意Java类相似。

+0

谢谢。我认为这是最好的解决方法。它需要在注释中指定两个参数(类型和字符串表示形式)---远比实际值更烦人---但它起作用! –

+0

@DavidB。它不应该,你有这个领域的类型 - 使用它。 –

+0

@Dave。正如目前所写,没有一个领域的财产,所以你的建议是不可能的。唯一的字段是关键字符串。值的类型是(或理想情况下)从初始值推断出来的。属性存储在第三部分对象中,因此每个对象都没有字段。另外,它们不能在这个类之外访问,所以注释可以被放置的getter或setter不可用或不可取。 –

1

对于不同的类型你可能有不同的属性,然后检查你的代码中哪一个属性有值。因此,而不是initialValue,你可能有initialInt,initialString,initial(...)。麻烦,但我能想到的唯一方法是始终使用一个字符串值,然后解析它的具体类型。

另一种选择可能是颠倒你的声明。在注释中使用关键字,并将值作为变量进行注释?

+0

颠倒声明是一个聪明的想法。不幸的是,我需要可访问的密钥作为静态最终字段,但否则会起作用。 –

+1

另一个想法,虽然我并不是说它是一个很好的(或者甚至是好的)想法,但是将属性属性作为包含默认值以及通过反射访问的类中另一个字段的名称。 –

+0

这肯定会使注解处理代码变得更清洁,但会以牺牲额外的静态字段为代价。要求将默认值作为静态字段访问实际上不会太糟糕(至少我现在正在设想的事情)。这些都是Java的注释类型系统的限制,但至少这个有一些可测量的积极副作用(如果你眯得够紧),而不仅仅是负面的副作用。 –