有时服务器上线了 但是有些代码因为程序原因可能导致没有执行 需要主动调用执行下 或者为了排查线上问题 主动获取某个方法或者变量的返回值 可以使用脚本来做线上的修复处理
javascript 也是可以的 但是编写脚本 有些时候总有字段类型转换的问题
beanshell是java脚本 写起来方便很多
不过 使用这些脚本修复的一个基础是要有一个容器存放所有的对象 如果使用了spring的话就不用考虑了
ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("js");
ApplicationContext context = GameServerContext.getAppContext();
for (String beanName : context.getBeanDefinitionNames()) {
manager.put(beanName, context.getBean(beanName));
try {
interpreter.set(beanName, context.getBean(beanName));
} catch (Exception e) {
throw new ServiceException(e);
}
}
//让所有的非public方法和字段可供调用
try {
Capabilities.setAccessibility(true);
} catch (Unavailable e) {
throw new ServiceException(e);
}
先把对象都放到对应的对象里面去 这样后面写的脚本才能获取到对应的对象
Interpreter是 beanshell里的一个类 执行方法调用的时候 可能有些方法是private 或者 protected的 所以需要提前设置下 方便脚本调用 Capabilities.setAccessibility(true);
声明下代码不是我写的
.----.
_.'__ `.
.--(#)(##)---/#\
.' @ /###\
: , #####
`-..__.-' _.-\###/
`;_: `"'
.'"""""`.
/, LOL ,\
// 很穷! \\
`-._______.-'
___`. | .'___
(______|______)