安全到达 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) {/*...*/}
}
问题有没有
- 更安全
- 更简单
在 (< 8) java 中获得 reflect.Method
s 的方法?
在 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();
或类似的东西,具体取决于您的系统的外观。
与"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) {/*...*/}
}
问题有没有
- 更安全
- 更简单
在 (< 8) java 中获得 reflect.Method
s 的方法?
在 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();
或类似的东西,具体取决于您的系统的外观。