由于最近在做的分布式爬虫中用到了 XXL-GLUE 来动态执行抓取脚本。由于抓取脚本较多,想着针对一些通用操作比如存库封装了父类CrawlerWorker,并且由 CrawlerWorker 实现了GlueHandler接口。
然后由KaguraScript extends CrawlerWorker然后直接在 KaguraScript 中直接使用父类 CrawlerWorker 中的duplicateKeyDao,但是它居然是null。
虽然GlueFactory中injectService方法会在反射后注入@Resource跟@Autowired的字段,但 injectService 方法是通过instance.getClass().getDeclaredFields();显然问题在这, getDeclaredFields方法无法获取从父类继承的属性。
找到了问题我们该如何解决呢, 其实我们只需要把com.xxl.glue.core.GlueFactory.java类中injectService方法第76行的getDeclaredFields()改为getFields()即可,这时就该instrument()登场了,直接上代码:
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
//替换原GlueFactory.java中第76行getDeclaredFields()为getFields(),不然父类@Autowired无法注入
String methadName = "injectService";
CtClass glueFactory = classPool.get("com.xxl.glue.core.GlueFactory");
CtMethod injectService = glueFactory.getDeclaredMethod(methadName);
injectService.instrument(
new ExprEditor() {
public void edit(MethodCall m) throws CannotCompileException {
if (m.getMethodName().equals("getDeclaredFields")) {
m.replace("{" +
"$_ = $0.getFields();" +
"}");
}
}
});
glueFactory.toClass();
未经允许不得转载:鹞之神乐 » javassist instrument()方法实战




javassist 在 spring boot jar中启动报错:javassist.NotFoundException: