You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Brian Dellisanti (Jira)" <ji...@apache.org> on 2021/03/02 14:15:00 UTC

[jira] [Updated] (GROOVY-9961) List "size" property yields an ArrayList, not an integer, on Java 16 RC build 36

     [ https://issues.apache.org/jira/browse/GROOVY-9961?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Brian Dellisanti updated GROOVY-9961:
-------------------------------------
    Affects Version/s: 4.0.0-alpha-2

> List "size" property yields an ArrayList, not an integer, on Java 16 RC build 36
> --------------------------------------------------------------------------------
>
>                 Key: GROOVY-9961
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9961
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.4.15, 3.0.7, 4.0.0-alpha-2
>            Reporter: Brian Dellisanti
>            Priority: Major
>
> On Java 16 RC build 36, the "size" property yields an ArrayList. This change in behavior seems related to JEP 396 ([https://openjdk.java.net/jeps/396]). It is surprising that the new behavior is to return a list because that causes comparisons with numbers to yield false rather than throw an exception on evaluating ".size", which causes code to fail silently.
> From groovy console:
> {noformat}
> groovy> def x = [] 
> groovy> println(System.getProperty("java.version")) 
> groovy> println(x.size) 
> groovy> println(x.size()) 
> groovy> println(x === x.size) 
> groovy> println(x.getClass()) 
> groovy> println(x.size.getClass()) 
>  
> 16
> []
> 0
> false
> class java.util.ArrayList
> class java.util.ArrayList
> {noformat}
> On Java 15:
> {noformat}
> groovy> def x = [] 
> groovy> println(System.getProperty("java.version")) 
> groovy> println(x.size) 
> groovy> println(x.size()) 
> groovy> println(x === x.size) 
> groovy> println(x.getClass()) 
> groovy> println(x.size.getClass()) 
>  
> 15.0.1
> 0
> 0
> false
> class java.util.ArrayList
> class java.lang.Integer
> {noformat}
> Also with Java 15, this is logged to the console:
> {noformat}
> WARNING: An illegal reflective access operation has occurred
> WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v9.Java9 (file:/Users/bdd/Downloads/groovy-3.0.7/lib/groovy-3.0.7.jar) to field java.util.ArrayList.size
> WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v9.Java9
> WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
> WARNING: All illegal access operations will be denied in a future release
> {noformat}
> Overriding the new illegal access behavior restores Java 15 behavior:
> {noformat}
> $ export JAVA_OPTS=--illegal-access=permit
> $ ./bin/groovyConsole
> OpenJDK 64-Bit Server VM warning: Option --illegal-access is deprecated and will be removed in a future release.
> WARNING: An illegal reflective access operation has occurred
> WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v9.Java9 (file:/Users/bdd/Downloads/groovy-3.0.7/lib/groovy-3.0.7.jar) to field java.util.ArrayList.size
> WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v9.Java9
> WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
> WARNING: All illegal access operations will be denied in a future release
> {noformat}
> {noformat}
> groovy> def x = [] 
> groovy> println(System.getProperty("java.version")) 
> groovy> println(x.size) 
> groovy> println(x.size()) 
> groovy> println(x === x.size) 
> groovy> println(x.getClass()) 
> groovy> println(x.size.getClass()) 
>  
> 16
> 0
> 0
> false
> class java.util.ArrayList
> class java.lang.Integer
> {noformat}
> Full Java version info:
> {noformat}
> groovy-3.0.7$ java -version
> openjdk version "16" 2021-03-16
> OpenJDK Runtime Environment (build 16+36-2231)
> OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)