【问题标题】:get java.lang.reflect.Method safely安全地获取 java.lang.reflect.Method
【发布时间】:2020-03-01 15:11:48
【问题描述】:

类似的interfaces 用于事件系统作为“监听器”

interface Updatable {
  void update();
}

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

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

要实现。 Updatable 中获取update 之类的“听众”的java.lang.reflect.Method

尝试。一个选项是使用反射(不安全)找出Method来调用

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

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. 更简单

在 (reflect.Methods 的方法?

【问题讨论】:

  • 为什么不使用匿名内部类而不是 lambda 表达式?你的假设是正确的,这种使用反射很慢。
  • 使用类似的东西:github.com/luontola/retrolambda
  • @Holger 你是对的,我删除了误导性的 java 8 代码!
  • 实际上,我不明白您要解决的问题。你想达到什么目的?你谈论了很多关于如何你想做某事而不是你想要实现什么。这似乎是XY problem 的一个实例。我没有得到你关于接口和回调的简要解释。我认为MCVE 而不是一组不连贯的孤立代码 sn-ps 将有很大帮助。
  • 只需使用普通的匿名类(或使用上面链接的此 retrolambda 的 lambda)并注册一个函数以在某处调用这些方法中的每一个,然后您就不需要任何反射

标签: java methods reflection java-7


【解决方案1】:

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

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

只需使用 retrolambda

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

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

【讨论】:

  • 在我的例子中:spot(new Signal(){@Override public void spot(Updatable u){ u.update(); }});
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多