我有一个应用程序(使用Java 8),它以嵌入式方式使用Groovy脚本,如下所示:
GroovyClassLoader gcl = new GroovyClassLoader();
Class calcClass = gcl.parseClass(myclass);
GroovyObject calc = (GroovyObject) calcClass.newInstance();
return (String) calc.invokeMethod("evaluateScript", new Object[]{});
字符串
一直都很有效。
我最近升级到了Java 17,同样的逻辑生成了下面的异常:
Unable to evaluate smart template script: java.lang.reflect.InaccessibleObjectException: Unable to make java.text.AttributedCharacterIterator java.text.Format.createAttributedCharacterIterator(java.text.AttributedCharacterIterator[]) accessible: module java.base does not "opens java.text" to unnamed module @4ec24700
型
我正在从java.text中使用SimpleDateFormat,脚本似乎不允许访问这个包中的类。
有什么方法可以让它工作吗?Groovy文档(https://docs.groovy-lang.org/latest/html/documentation/guide-integrating.html)没有提到任何关于Java模块或类似的东西。
谢谢你,谢谢
更新:添加在脚本中调用的代码:
String FRIST(String fromDate, String addDays, String format) {
if(fromDate==null || "".equals(fromDate))
return "??.??.????";
java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("dd.MM.yyyy");
try {
java.util.Date testDate = df.parse(fromDate)
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime(testDate);
if(cal.get(Calendar.YEAR) < 2000)
cal.add(java.util.Calendar.YEAR, 2000);
cal.add(java.util.Calendar.DAY_OF_MONTH, Integer.parseInt(addDays));
testDate = cal.getTime();
if(format==null) {
return df.format(testDate);
} else {
return new java.text.SimpleDateFormat(format).format(testDate);
}
} catch (Throwable t) {
return "??.??.????"
}
}
型
1条答案
按热度按时间eagi6jfj1#
这个问题可以通过升级到最新的Groovy稳定版本(在撰写本文时是4.0.16)来解决。
感谢上面的评论者,特别是@david-conrad对升级Groovy的具体建议。