获取 Lambda 函数的函数名
通过反射可以获得 Lambda函数的真实函数名
public Router handler(final Handler handler) {
this.handler = handler;
final Class<?> clazz = handler.getClass();
try {
final Serializable lambda = handler;
// Latke 框架中 "writeReplace" 是个什么魔数? https://ld246.com/article/1568102022352
final Method m = clazz.getDeclaredMethod("writeReplace");
m.setAccessible(true);
final SerializedLambda sl = (SerializedLambda) m.invoke(lambda);
final String implClassName = sl.getImplClass().replaceAll("/", ".");
final Class<?> implClass = Class.forName(implClassName);
this.method = implClass.getDeclaredMethod(sl.getImplMethodName(), RequestContext.class);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Found lambda method reference impl method failed", e);
}
return this;
}
这是获取 Lambda 函数名的一个“技巧”。writeReplace
是序列化操作相关的方法,对象序列化时会被调用。Lambda 函数是一个可序列化的对象,所以可以用该方式获取到函数名。
-
java