\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;
        }
被采纳的回答
  • 88250    

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

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

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