[
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)