JFinal中使用QuartzPlugin报ClassCastException解决方法

JDK1.8中泛型反射修改对旧版本的影响

本文地址:http://blog.csdn.net/sushengmiyan
本文作者:苏生米沿

问题复现环境:

  • JDK1.8

  • JFinal1.9

  • quartz2.2.1

启动环境可参考如下文章内容: https://my.oschina.net/u/147181/blog/664223


问题描述

JFinal配置好quartz的插件类后,启动报错。报错信息如下:

[ERROR]-[com.jfinal.core.Config.startPlugins()]: Plugin start error: com.jfinal.ext.plugin.quartz.QuartzPlugin. 
org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
java.lang.ClassCastException: org.quartz.CronScheduleBuilder cannot be cast to [Ljava.lang.Object;
    at com.jfinal.ext.plugin.quartz.QuartzPlugin.startJobs(QuartzPlugin.java:97)
    at com.jfinal.ext.plugin.quartz.QuartzPlugin.start(QuartzPlugin.java:64)
    at com.jfinal.core.Config.startPlugins(Config.java:87)
    at com.jfinal.core.Config.configJFinal(Config.java:48)
    at com.jfinal.core.JFinal.init(JFinal.java:67)
    at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)

错误定位

temp=Reflect.on(temp).call(“withSchedule”,Reflect.on(“org.quartz.CronScheduleBuilder”).call(“cronSchedule”, jobCronExp).get()).get();

程序在此处抛出异常。

解决方式

将上述报错语句改为如下两句。

      CronScheduleBuilder csb = Reflect.on("org.quartz.CronScheduleBuilder").call("cronSchedule", jobCronExp).get();
      temp = Reflect.on(temp).call("withSchedule",csb).get();  

再次启动程序,不再报错。

错误来源:

JDK1.8对泛型的校验加强,此处插件使用的反射的方式来获取CronTrigger 在构造中需要一个CronScheduleBuilder类型的创建器,当按照错误定位的那句来写的时候,反射返回的类型是Object而TriggerBuilder的方法中需要的参数是一个泛型的CronScheduleBuilder类型。泛型检查报错ClassCastException。

扩展阅读:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

以上来源-JDK8在泛型类型推导上的变化:
http://lovestblog.cn/blog/2016/04/03/type-inference/

目录

posted on 2016-09-29 17:17  木鱼哥  阅读(330)  评论(0编辑  收藏  举报

导航