获取 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 函数是一个可序列化的对象,所以可以用该方式获取到函数名。