[ 
https://issues.apache.org/jira/browse/BEAM-13020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17514239#comment-17514239
 ] 

Beam JIRA Bot commented on BEAM-13020:
--------------------------------------

This issue was marked "stale-P2" and has not received a public comment in 14 
days. It is now automatically moved to P3. If you are still affected by it, you 
can comment and move it back to P2.

> Fragile reference to private synthetic this$ field
> --------------------------------------------------
>
>                 Key: BEAM-13020
>                 URL: https://issues.apache.org/jira/browse/BEAM-13020
>             Project: Beam
>          Issue Type: Bug
>          Components: sdk-java-core
>            Reporter: Liam Miller-Cushon
>            Priority: P3
>              Labels: starter
>
> The following code is using reflection to access a field with a name starting 
> with `this$`:
> [https://github.com/apache/beam/blob/4fbdcca377fb9d804433f3014a7e7dfcef2e02f9/runners/spark/src/main/java/org/apache/beam/runners/spark/SparkNativePipelineVisitor.java#L186]
> The OpenJDK javac generates private synthetic fields with names starting with 
> `this$` as an implementation detail of inner classes. In the future that 
> implementation detail may be changing, and the `this$` field will no longer 
> be generated for all inner classes. For more information about the proposed 
> change, see: [https://bugs.openjdk.java.net/browse/JDK-8271717]
> Please consider alternatives to accessing the private synthetic `this$` field 
> to ensure this code continues to work after the change. For example, consider 
> passing an explicit copy of the enclosing instance to code that needs access 
> to it, or adding an explicit getter to the inner class.
> For example, given:
> {code:java}
> class Outer {
>   int x;
>   class Inner1 {
>     int f() {
>       return x;
>     }
>   }
>   class Inner2 {
>     void g() {
>       System.err.println("hello");
>     }
>   }
> }
> {code}
> Currently `Inner1` and `Inner2` both have a synthetic field named `this$0` 
> that stores a reference to `Outer`.
> In the future the implementation detail might be changing to omit the field 
> from classes that don't reference the enclosing instance. So in the example, 
> `Inner1` would still have the synthetic field because it accesses the field 
> `x` in the enclosing instance `Outer`. However `Inner2` would no longer have 
> a synthetic field, because it doesn't access any state from its enclosing 
> instance.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to