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