読者です 読者をやめる 読者になる 読者になる

slim3でjspのスクリプトレットでもHot Reloadingする方法(2)

slim3でjspのスクリプトレットでもHot Reloadingする方法 - あおうさ@日記の続き。
CallerUtil.getCallerClassLoader()でJSPのクラスローダーを取得する。

ViewHelper.class

@SuppressWarnings("unchecked")
public static <T> T get(String attributeKey) {
    T result = (T)RequestLocator.get().getAttribute(attributeKey);
    if (result != null && isHotReloading()){
        byte[] bytes = ByteUtil.toByteArray(result);
        result = (T)ByteUtil.toObject(bytes, CallerUtil.getCallerClassLoader());
    }
    return result;
}

private static boolean isHotReloading(){
    return (Thread.currentThread().getContextClassLoader() instanceof HotReloadingClassLoader);
}

jsp

<%@ page import="static study.ViewHelper.*" %>
<% 
  List<Blog> blogList = get("blogList");
  Blog blog = blogList.get(0);
%>

Thread.currentThread().getContextClassLoader()

Hot Reloadingではないとき

(com.google.appengine.tools.development.IsolatedAppClassLoader) com.google.appengine.tools.development.IsolatedAppClassLoader@53c3f5

Hot Reloadingのとき

(org.slim3.controller.HotReloadingClassLoader) org.slim3.controller.HotReloadingClassLoader@1d00beb