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

Eric Milles updated GROOVY-9501:
--------------------------------
    Description: 
Consider the following:
{code:groovy}
class Main extends Outer {
  static main(args) {
    newInstance().newThread()
  }
}

abstract class Outer {
  private static volatile boolean flag

  protected void newThread() {
    Thread thread = new Inner()
    thread.start()
    thread.join()
  }

  private final class Inner extends Thread {
    void run() {
     try {
      if (!flag) {
        sleep(1000)
      }
     } catch (Throwable t) {
      t.printStackTrace()
     }
    }
  }
}
{code}

In this example, {{Main}} extends {{Outer}} and is the type that is 
instantiated and used.  {{Inner}} makes reference to private static field 
{{flag}} of {{Outer}}.  When {{Inner}} is non-static as in this example, it 
gets the following error when reading "flag":
{code}
groovy.lang.MissingPropertyException: No such property: flag for class: Main
Possible solutions: class
        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65)
        at 
org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87)
        at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:309)
        at Outer$Inner.run(Script1.groovy:20)
{code}

*Note*: changing {{Inner}} from final to static fixes this specific case.  
However, non-static inners that need to be that way are going to have this 
problem.

This is possibly related to: GROOVY-8999, et al.


  was:
Consider the following:
{code:groovy}
class Main extends Outer {
  static main(args) {
    newInstance().newThread()
  }
}

abstract class Outer {
  private static volatile boolean flag

  protected void newThread() {
    Thread thread = new Inner()
    thread.start()
    thread.join()
  }

  private final class Inner extends Thread {
    void run() {
     try {
      if (!flag) {
        sleep(1000)
      }
     } catch (Throwable t) {
      t.printStackTrace()
     }
    }
  }
}
{code}

In this example, {{Main}} extends {{Outer}} and is the type that is 
instantiated and used.  {{Inner}} makes reference to private static field 
{{flag}} of {{Outer}}.  When {{Inner}} is non-static as in this example, it 
gets the following error when reading "flag":
{code}
groovy.lang.MissingPropertyException: No such property: flag for class: Main
Possible solutions: class
        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65)
        at 
org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87)
        at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:309)
        at Outer$Inner.run(Script1.groovy:20)
{code}

*Note*: changing {{Inner}} from final to static fixes this specific case.  
However, non-static inners that need to be that way are going to have this 
problem.

This is possibly related to: GROOVY-8999



> MissingPropertyException for access to private static field from inner class 
> when subclassing
> ---------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-9501
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9501
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.10
>            Reporter: Eric Milles
>            Priority: Major
>
> Consider the following:
> {code:groovy}
> class Main extends Outer {
>   static main(args) {
>     newInstance().newThread()
>   }
> }
> abstract class Outer {
>   private static volatile boolean flag
>   protected void newThread() {
>     Thread thread = new Inner()
>     thread.start()
>     thread.join()
>   }
>   private final class Inner extends Thread {
>     void run() {
>      try {
>       if (!flag) {
>         sleep(1000)
>       }
>      } catch (Throwable t) {
>       t.printStackTrace()
>      }
>     }
>   }
> }
> {code}
> In this example, {{Main}} extends {{Outer}} and is the type that is 
> instantiated and used.  {{Inner}} makes reference to private static field 
> {{flag}} of {{Outer}}.  When {{Inner}} is non-static as in this example, it 
> gets the following error when reading "flag":
> {code}
> groovy.lang.MissingPropertyException: No such property: flag for class: Main
> Possible solutions: class
>       at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65)
>       at 
> org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:309)
>       at Outer$Inner.run(Script1.groovy:20)
> {code}
> *Note*: changing {{Inner}} from final to static fixes this specific case.  
> However, non-static inners that need to be that way are going to have this 
> problem.
> This is possibly related to: GROOVY-8999, et al.



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

Reply via email to