java - 安全地获取 java.lang.reflect.Method

标签 java methods reflection java-7

类似的接口(interface)用于事件系统作为“监听器”

interface Updatable {
  void update();
}

事件(→所有“监听”方法)由调用

spot(Method, Object... event);

实现。 获取“监听器”的java.lang.reflect.Method,如Updatable<中的update/

尝试。一种选择是使用反射(不安全)来找出要调用的方法

用法。在“监听器”接口(interface)中为每个方法创建一个常量,并将其用作参数

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.Method 的方法?

最佳答案

你可以在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();

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

关于java - 安全地获取 java.lang.reflect.Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60476511/

相关文章:

java - OpenAPI validator 规则使用 max 而不是 size

java - 当我们扩展 Thread 类时,如何调用 run() 方法

java - Eclipse 语法突出显示 Java Struts Hibernate Web 应用程序

git - 如何列出提交中更改的所有方法的签名?

java - 在运行时创建和覆盖 Java 枚举对象 [GregTech/minecraft]

java - sigmoid 的单神经元 delta 规则收敛

javascript - momentjs 中的几周数组

python - 将特殊方法动态分配给对象而不是 Python 中的类

java.lang.IllegalAccessException : Class z. y.x.u.SimpleCompileTest 无法使用修饰符 ""访问类 MyClass 的成员

c# - 枚举参数的 DefaultValue 和 RawDefaultValue 存在意外差异