Using java.awt.Toolkit.getDefaultToolkit().getScreenSize() reflectively causes InaccessibleObjectException
Alex Buckley
alex.buckley at oracle.com
Thu Jan 5 19:34:57 UTC 2017
Rony mentioned "the returned Toolkit is of type sun.awt.X11.XToolkit"
which suggests that he is calling getClass() on the result of
getDefaultToolkit(), and then reflecting further on that Class object
and its Methods. As has been discussed previously on jigsaw-dev, this
won't work for implementation classes; it's necessary to reflect over
exported classes and interfaces instead.
Alex
On 1/5/2017 11:22 AM, Phil Race wrote:
> This should be discussed on jigsaw-dev.
>
> But can you share your code ? - since the following works for me :
>
> import java.awt.Toolkit;
>
> public class TK {
> public static void main(String args[]) throws Exception {
> Toolkit tk = Toolkit.getDefaultToolkit();
> Class tkc = Class.forName("java.awt.Toolkit");
> java.lang.reflect.Method m = tkc.getMethod("getScreenSize");
> System.out.println(m.invoke(tk));
> }
> }
>
> ~/jdk9b142/bin/java TK
> java.awt.Dimension[width=1920,height=1200]
>
> -phil.
>
> On 01/05/2017 11:03 AM, Rony G. Flatscher wrote:
>> Experimenting with further scripts indicates that this is a systematic
>> problem whenever the official
>> APIs return members that are not made available to an unnamed module:
>> e.g. JavaFX some
>> "com.sun.javafx.collections.VetoableListDecorator" or in a "plain"
>> awt/swing app some
>> "sun.java2d.SungGraphics2D".
>>
>> ---rony
>>
>> On 05.01.2017 19:42, Rony G. Flatscher wrote:
>>> Trying to run a program that gets the screen dimensions using
>>> java.awt.Toolkit.getDefaultToolkit().getScreenSize() reflectively.
>>>
>>> On a 64-bit Ubuntu the returned Toolkit is of type
>>> sun.awt.X11.XToolkit. Reflectively invoking its
>>> method getScreenSize() causes the following exception to be thrown on
>>> 9-ea+134:
>>>
>>> java.lang.reflect.InaccessibleObjectException: unable to make
>>> member of class sun.awt.SunToolkit
>>> accessible: module java.desktop does not export sun.awt to
>>> unnamed module ...
>>>
>>> A little bit baffled as this is from a script that has been working
>>> flawlessly throughout more than
>>> a decade on various Java versions and which employs documented public
>>> methods only (the sun.awt
>>> object is returned by java.awt.Toolkit). Is this a known
>>> "legacy"problem :) that I could circumvent
>>> somehow or a bug that needs to be reported?
>>>
>>> ---rony
>>>
>
More information about the jigsaw-dev
mailing list