想在controller里加入一个init自动执行的方法结果失败

想法是这样的,首先 有个 base 类继承controller,然后base里面有个init方法,然后在拦截器里面写入以下代码来自动执行每个子类里面的init方法

...
Controller c = inv.getController();
Method method = c.getClass().getDeclaredMethod("init");
method.invoke(c);
...

结果执行的时候提示子类里面不存在 init 方法

而我改成这样,又能运行成功:

...
Base c = (Base)inv.getController();
c.init();
...

有点不太理解,我使用第一种方法为何不行呢?


评论区

JFinal

2017-08-10 10:49

getDeclaredMethod("init"); 改为 getMethod("init");

flash866

2017-08-10 14:53

@JFinal 原来如此,多谢!!

JFinal

2019-06-25 18:16

@flash866 如果是调用 Controller 中的 _init_(...),新版本提供了独立的 API 来支持这个功能:
com.jfinal.core.CPI._init_(Controller controller, Action action, HttpServletRequest request, HttpServletResponse response, String urlPara)

如果是调用你自己的 BaseController 中的 init() 方法,只需要强制转换为 BaseController 再高用即可:

if (inv.getController() instanceof BaseController) {
BaseController bc = (BaseController)inv.getController();
bc.init();
}

这样做的性能才是最高的,你目前的方法用的是反射,性能会低很多

flash866

2019-06-27 20:55

@JFinal 多谢还记得(PS:发现带有emoji表情会造成500错误)

JFinal

2019-06-27 20:57

@flash866 让 mysql 支持 utf8mb4 即可,jfinal 这头肯定是不干预这种事的

flash866

2019-06-28 08:31

@JFinal 嗯 我知道,我是指俱乐部的回复带表情会出错

JFinal

2019-06-28 10:41

@flash866 俱乐部的 encoding 还没改成 utf8mb4

热门反馈

扫码入社