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