安全到达 java.lang.reflect.Method

get java.lang.reflect.Method safely

与"listeners"

类似的interface用于事件系统
interface Updatable {
  void update();
}

事件(→ 所有 "listen" 方法)由

调用
spot(Method, Object... event);

实现。 得到java.lang.reflect.Method of "listeners" like update in Updatable.

Attempt. 一个选项是使用反射(不安全)找出Method来调用

用法。为"listener"中的每个方法创建一个常量接口 并将其用作参数

interface Updatable {
  void update();
  Method UPDATE = method(Updatable.class, "update");
}
//anywhere
spot(UPDATE);

使用这个 util 函数

static public @Nullable Method method(Class<?> of, String name, Class... params) {
  try {
    return of.getDeclaredMethod(name, params);
  }
  catch(Exception e) {/*...*/}
}

问题有没有

  1. 更安全
  2. 更简单

在 (< 8) java 中获得 reflect.Methods 的方法?

在 java 7 中,您可以使用普通函数 类 来执行此操作,它不漂亮但工作正常,如果您想让它更漂亮,您可以使用类似 https://github.com/luontola/retrolambda 这将允许您在 java 7 中使用 lambda 表达式,它将被编译为匿名内部 类.

Listener listenerMethod = new Listener() {
    @Override
    public void onEvent() {
        updatable.update();
    }
});
// anywhere, or in that "spot" method:
listenerMethod.onEvent();

而 retrolambda 只是

Listener listenerMethod = () -> updatable.update();

或类似的东西,具体取决于您的系统的外观。