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

Ryan Skraba commented on AVRO-3228:
-----------------------------------

Interesting!  Typically we are faced with the problem of reflecting 
user-defined classes (so techniques like "passing an explicit copy of the 
enclosing instance to code that needs access" are a nice recommendation we 
can't enforce).  But we should and could be using getEnclosingClass and 
getModifiers to find this info.

A good question is whether Inner2 could now be serialized/deserialized 
correctly via ReflectData, since it is "effectively" static (if not actually 
declared static)!

> Fragile reference to private synthetic this$ field
> --------------------------------------------------
>
>                 Key: AVRO-3228
>                 URL: https://issues.apache.org/jira/browse/AVRO-3228
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>            Reporter: Liam Miller-Cushon
>            Priority: Minor
>
> The following code is using reflection to access a field with a name starting 
> with `this$`:
> [https://github.com/apache/avro/blob/8f0b8d68c3fc10b6a5fc09bae4a5c30defe53897/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java#L70]
> 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.3.4#803005)

Reply via email to