Repast / repast.simphony

Git repository for Repast Simphony development
repast.github.io
90 stars 21 forks source link

Fix getPublicFieldsAndProperties in BaseObserver with Java 17 #88

Closed jozik closed 3 months ago

jozik commented 11 months ago

Calling repast.simphony.relogo.BaseObserver.createOrderedTurtlesFromCSV results in an error generated by getPublicFieldsAndProperties when using the bundled (Java 17) JRE, but not with Java 11.

FATAL [Thread-3] 15:20:53,094 GUIScheduleRunner - RunTimeException when running the schedule
Current tick (0.0)
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at repast.simphony.engine.schedule.DynamicTargetAction.execute(DynamicTargetAction.java:72) ~[?:?]
    at repast.simphony.engine.controller.ScheduledMethodControllerAction$ScheduleMethodAllAction.execute(ScheduledMethodControllerAction.java:336) ~[?:?]
    at repast.simphony.engine.schedule.DefaultAction.execute(DefaultAction.java:38) ~[?:?]
    at repast.simphony.engine.schedule.ScheduleGroup.executeList(ScheduleGroup.java:205) ~[?:?]
    at repast.simphony.engine.schedule.ScheduleGroup.execute(ScheduleGroup.java:231) ~[?:?]
    at repast.simphony.engine.schedule.Schedule.execute(Schedule.java:375) ~[?:?]
    at repast.simphony.ui.GUIScheduleRunner$ScheduleLoopRunnable.run(GUIScheduleRunner.java:52) ~[?:?]
    at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.lang.reflect.InvocationTargetException
    at farmereconomy.relogo.UserObserver$$FastClassByCGLIB$$b09cb87e.invoke(<generated>) ~[?:?]
    at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) ~[?:?]
    at repast.simphony.engine.schedule.DynamicTargetAction.execute(DynamicTargetAction.java:69) ~[?:?]
    ... 7 more
Caused by: groovy.lang.MissingMethodException: No signature of method: static java.lang.reflect.Modifier.isSynthetic() is applicable for argument types: (Integer) values: [4233]
Possible solutions: isStatic(int)
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1584) ~[groovy-3.0.13-indy.jar:3.0.13]
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1570) ~[groovy-3.0.13-indy.jar:3.0.13]
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) ~[groovy-3.0.13-indy.jar:3.0.13]
    at repast.simphony.relogo.BaseObserver$_getPublicFieldsAndProperties_closure3.doCall(BaseObserver.groovy:606) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) ~[groovy-3.0.13-indy.jar:3.0.13]
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) ~[groovy-3.0.13-indy.jar:3.0.13]
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274) ~[groovy-3.0.13-indy.jar:3.0.13]
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035) ~[groovy-3.0.13-indy.jar:3.0.13]
    at groovy.lang.Closure.call(Closure.java:412) ~[groovy-3.0.13-indy.jar:3.0.13]
    at groovy.lang.Closure.call(Closure.java:428) ~[groovy-3.0.13-indy.jar:3.0.13]
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2165) ~[groovy-3.0.13-indy.jar:3.0.13]
    at org.codehaus.groovy.runtime.dgm$197.doMethodInvoke(Unknown Source) ~[groovy-3.0.13-indy.jar:3.0.13]
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) ~[groovy-3.0.13-indy.jar:3.0.13]
    at repast.simphony.relogo.BaseObserver.getPublicFieldsAndProperties(BaseObserver.groovy:604) ~[?:?]
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) ~[groovy-3.0.13-indy.jar:3.0.13]
    at repast.simphony.relogo.BaseObserver.createOrderedTurtlesFromCSV(BaseObserver.groovy:223) ~[?:?]
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) ~[groovy-3.0.13-indy.jar:3.0.13]
    at repast.simphony.relogo.BaseObserver.createOrderedTurtlesFromCSV(BaseObserver.groovy:181) ~[?:?]
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) ~[groovy-3.0.13-indy.jar:3.0.13]
    at farmereconomy.relogo.UserObserver.setup(UserObserver.groovy:18) ~[?:?]
    at farmereconomy.relogo.UserObserver$$FastClassByCGLIB$$b09cb87e.invoke(<generated>) ~[?:?]
    at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) ~[?:?]
    at repast.simphony.engine.schedule.DynamicTargetAction.execute(DynamicTargetAction.java:69) ~[?:?]
    ... 7 more
etatara commented 7 months ago

FIrst we should try updating Eclipse + Groovy to see if that fixes the issue.

ncollier commented 6 months ago

Note - Modifier.isSynthetic is a protected method in both 11 and 17.

ncollier commented 6 months ago

Looks like this is fixed in groovy 4 - https://issues.apache.org/jira/browse/GROOVY-10070. Issue occurs in jdk >= 16. If we can't use Groovy 4, I think we need to use the access modifiers mentioned in the issue.

ncollier commented 6 months ago

Adding --add-opens java.base/java.lang.reflect=ALL-UNNAMED to launcher fixes issue, but obviously using groovy 4 would be better.

ncollier commented 3 months ago

Added --add-opens java.base/java.lang.reflect=ALL-UNNAMED to launcher args etc. in 440d74dd