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

Thomas Watson resolved ARIES-1724.
----------------------------------
    Resolution: Fixed

> Proxy generates calls to static methods in <clinit> which can fail on Java 9
> ----------------------------------------------------------------------------
>
>                 Key: ARIES-1724
>                 URL: https://issues.apache.org/jira/browse/ARIES-1724
>             Project: Aries
>          Issue Type: Bug
>          Components: Proxy
>         Environment: Java 9
>            Reporter: Thomas Watson
>            Assignee: Thomas Watson
>
> The issue is that the JVMS was changed in Java 9 to disallow "final" fields 
> from being modified outside of the <clinit> method.  Even other methods 
> called by <clinit>.
> "if the field is final the instruction must occur in the < clinit > method of 
> the current class. Otherwise, an IllegalAccessError is thrown."
> The issue here is that aires generates method proxies that stores references 
> to the generated methods in 'private static final' fields, which it then 
> assigns in woven static init weaving code by calling another generated static 
> method.
> It seems that we can trivially fix this by removing the 'final' modifier of 
> the generated method field.
> Here is what the current generated code would looking as a java class:
> {code:title=Foo.java|borderStyle=solid}
> public class Foo {
>   static final boolean bar;
>   static {
>     setBar(); // blows up with IAE as of class version >= 53
>   }
>   static void setBar() {
>     bar = true;
>   }
> }
> {code}
> Where the bar field is a field declared by the proxy code and set by another 
> static method which is called by the <clinit> block.  A proper fix would be 
> to change the generated code to do something more like this:
> {code:title=Foo.java|borderStyle=solid}
> public class Foo {
>     static final boolean bar;
>     static {
>         bar = getBar();
>     }
>     static boolean getBar() {
>         return true;
>     }
> }
> {code}
> But as of now I am not sure how complicated of a change that would be to the 
> proxy code.  The simple fix is to not generate these static private fields as 
> final.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to