Code Review Request For 8155757: Encapsulate impl_ methods in animation, canvas, image, input, layout, paint, and text packages
Jim Graham
james.graham at oracle.com
Fri Apr 29 23:04:00 UTC 2016
One comment on the implementation. For the methods used by an accessor inner class, if you make them private in the
outer class then that inner class will need a hidden accessor method to be added in the bytecodes. If you make them
package-private then they can access the method directly.
Basically, an inner class is really "just another class in the package, but with a special name" and actually have no
access to private methods in their outer classes at all, but javac works around this by adding a hidden method that has
more open access and using that.
An example is Image.getPlatformImage() - you turned it from "public and impl_" into private. Why not just leave it
package-private/default access?
For example, compiling this class:
public class InnerPrivateTest {
private void foo() {}
public class InnerClass {
public void bar() { foo(); }
}
}
yields this byte code for InnerPrivateTest.class:
public class InnerPrivateTest {
public InnerPrivateTest();
Code:
0: aload_0
1: invokespecial #2 // Method java/lang/Object."<init>":()V
4: return
private void foo();
Code:
0: return
static void access$000(InnerPrivateTest);
Code:
0: aload_0
1: invokespecial #1 // Method foo:()V
4: return
}
and this for the InnerClass:
public class InnerPrivateTest$InnerClass {
final InnerPrivateTest this$0;
public InnerPrivateTest$InnerClass(InnerPrivateTest);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LInnerPrivateTest;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
public void bar();
Code:
0: aload_0
1: getfield #1 // Field this$0:LInnerPrivateTest;
4: invokestatic #3 // Method InnerPrivateTest.access$000:(LInnerPrivateTest;)V
7: return
}
Changing the access on foo() to default (package private), yields this byte code:
public class InnerPackageTest {
public InnerPackageTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
void foo();
Code:
0: return
}
public class InnerPackageTest$InnerClass {
final InnerPackageTest this$0;
public InnerPackageTest$InnerClass(InnerPackageTest);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LInnerPackageTest;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
public void bar();
Code:
0: aload_0
1: getfield #1 // Field this$0:LInnerPackageTest;
4: invokevirtual #3 // Method InnerPackageTest.foo:()V
7: return
}
...jim
On 4/29/16 11:50 AM, Chien Yang wrote:
> Hi Kevin,
>
> Please review the proposed fix:
>
> JIRA: https://bugs.openjdk.java.net/browse/JDK-8155757
> Webrev: http://cr.openjdk.java.net/~ckyang/JDK-8155757/webrev.00/
>
> Thanks,
> - Chien
More information about the openjfx-dev
mailing list