javassist instrument()方法实战

由于最近在做的分布式爬虫中用到了 XXL-GLUE 来动态执行抓取脚本。由于抓取脚本较多,想着针对一些通用操作比如存库封装了父类CrawlerWorker,并且由 CrawlerWorker 实现了GlueHandler接口。

然后由KaguraScript extends CrawlerWorker然后直接在 KaguraScript 中直接使用父类 CrawlerWorker 中的duplicateKeyDao,但是它居然是null

虽然GlueFactoryinjectService方法会在反射后注入@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()方法实战

赞 (0) 打赏

评论

6+6=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏