首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法将Java注解作为参数传递?

有没有办法将Java注解作为参数传递?
EN

Stack Overflow用户
提问于 2010-07-19 23:00:51
回答 5查看 27.1K关注 0票数 30

伙计们,有没有办法将Annotation作为直接参数传递(而不是做所有的反射开销)?例如,在下面的代码中,我有一个包含int值的注释号,我想作为参数传递给addImpl方法,我该如何做到这一点(除了通过反射)?

代码片段:

代码语言:javascript
复制
@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);
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-19 23:03:52

是的,您可以像这样传递注释(就像它们是普通接口一样)。

唯一不能做的事情就是在运行时创建该接口的实例。你只能接受现有的注解并传递它们。

代码语言:javascript
复制
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));
    }
}
票数 23
EN

Stack Overflow用户

发布于 2010-07-19 23:10:34

你可以像这样做:

代码语言:javascript
复制
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基本上是一个接口,因此您必须创建实现该接口的匿名类的实例,并将其传递给该方法。

尽管我不知道你为什么要这么做。如果你需要传递一个值给某个东西,你真的应该使用一个类。

票数 10
EN

Stack Overflow用户

发布于 2010-07-19 23:05:15

据我所知,没有您想要在add实现中使用的“注释文字”这种东西。

我认为最接近这一点的方法是声明一个接受java.lang.annotation.Annotation类型参数的方法--但是你仍然需要通过反射从类/方法对象中获取这些实例。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3282239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档