伙计们,有没有办法将Annotation作为直接参数传递(而不是做所有的反射开销)?例如,在下面的代码中,我有一个包含int值的注释号,我想作为参数传递给addImpl方法,我该如何做到这一点(除了通过反射)?
代码片段:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
public @interface Number {
int value();
}
public void add(int x2) {
addImpl(@Number(value = 10) lol, x2);
}
public void addImpl(Number a, int b) {
System.out.println(a.value() + b);
}
public static void main(String[] args) {
new TestClass().add(3);
}
发布于 2010-07-19 23:03:52
是的,您可以像这样传递注释(就像它们是普通接口一样)。
唯一不能做的事情就是在运行时创建该接口的实例。你只能接受现有的注解并传递它们。
import java.lang.annotation.*;
public class Example {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public static @interface Number {
int value();
}
@Number(value = 42)
public int adder(final int b) throws SecurityException, NoSuchMethodException {
Number number = getClass().getMethod("adder", int.class).getAnnotation(Number.class);
return addImpl(number, b);
}
public int addImpl(final Number a, final int b) {
return a.value() + b;
}
public static void main(final String[] args) throws SecurityException, NoSuchMethodException {
System.out.println(new Example().adder(0));
}
}
发布于 2010-07-19 23:10:34
你可以像这样做:
public void add(int x2) {
addImpl(new Number() {
@Override
public int value() {
return 10;
}
@Override
public Class<? extends Annotation> annotationType() {
return Number.class;
}
}, x2);
}
由于Number基本上是一个接口,因此您必须创建实现该接口的匿名类的实例,并将其传递给该方法。
尽管我不知道你为什么要这么做。如果你需要传递一个值给某个东西,你真的应该使用一个类。
发布于 2010-07-19 23:05:15
据我所知,没有您想要在add
实现中使用的“注释文字”这种东西。
我认为最接近这一点的方法是声明一个接受java.lang.annotation.Annotation类型参数的方法--但是你仍然需要通过反射从类/方法对象中获取这些实例。
https://stackoverflow.com/questions/3282239
复制相似问题