如何使用Method Reference运算符获取方法

时间:2017-08-18 10:15:07

标签: java reflection annotations

我想在另一个类的一个类中引用一个注释值。喜欢这里 -

class A {
    private static final String STATIC_STRING = B.class.getMethod("myMethod").getAnnotation(SomeAnnotation.class).name();
}

这里的问题是我无法使用此语法,因为它需要将getMethod包装在try-catch中,这是不可能的。虽然我可以使用static块来创建这个变量并且只是在catch块中吞噬异常,但我不想这样做,因为如果以后方法名称被更改,编译器会赢得& #39; t在static块中抛出错误。

我想知道我是否能做类似

的事情
private static final String STATIC_STRING = (B::myMethod).getAnnotation(SomeAnnotation.class).name();

注意:BSomeAnnotation都不是我的来源,它们来自另一个图书馆。

我这里有2个问题

  • 是否有更好的方法从注释中获取价值,最好不使用Google Reflections或类似的任何外部库?
  • 如何使用::获取java.lang.reflect.Method的实例?完全可能吗?如果是,反之亦然,即从Method对象创建供应商或映射器?

1 个答案:

答案 0 :(得分:0)

关于第一个问题,你考虑过使用吸气剂吗?

private static String getSomeAnnotationName() {
    try {
        return B.class.getMethod("myMethod").getAnnotation(SomeAnnotation.class).name();
    } catch (NoSuchMethodException e) {
        return null;
    }
}

对于您的第二个问题,我认为从Method获取::是不可能的。这是因为从::得到的方法代表了功能接口的实现,而不是真正的方法。但是,反过来是可能的。你可以像这样创建一个lambda:

Consumer<SomeType> consumer = x -> {
    try {
        yourMethod.invoke(someObject, x)
    } catch (...) {
        // again you have to ignore the exceptions here, unfortunately
    }
};