本文主要是介绍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/
目录
- JDK18中泛型反射修改对旧版本的影响
- 问题描述
- 错误定位
- 解决方式
- 错误来源
- 扩展阅读
- 目录
这篇关于JFinal中使用QuartzPlugin报ClassCastException解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!