\latke\latke-core\src\main\java\org\b3log\latke\servlet\DispatcherServlet.java 中有如下代码,请问'writeReplace'这个是什么用法,为啥 clazz 会有'writeReplace'方法? public Router handler ..

Latke 框架中 "writeReplace" 是个什么魔数?

\latke\latke-core\src\main\java\org\b3log\latke\servlet\DispatcherServlet.java 中有如下代码,请问"writeReplace"这个是什么用法,为啥 clazz 会有"writeReplace"方法?

public Router handler(final ContextHandler handler) {
            this.handler = handler;
            final Class clazz = handler.getClass();
            try {
                final Serializable lambda = handler;
                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;
        }
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    59 引用 • 435 回帖 • 512 关注
  • 反射
    12 引用 • 28 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1304 引用 • 8462 回帖 • 578 关注
被采纳的回答
  • 88250 1

    这是获取 Lambda 函数名的一个“技巧”。writeReplace 是序列化操作相关的方法,对象序列化时会被调用。Lambda 函数是一个可序列化的对象,所以可以用该方式获取到函数名,方便后续通过统一反射的方式来调用(同时支持函数式和注解式路由)。

1 回帖
请输入回帖内容...
  • 88250 1

    这是获取 Lambda 函数名的一个“技巧”。writeReplace 是序列化操作相关的方法,对象序列化时会被调用。Lambda 函数是一个可序列化的对象,所以可以用该方式获取到函数名,方便后续通过统一反射的方式来调用(同时支持函数式和注解式路由)。