Using java.awt.Toolkit.getDefaultToolkit().getScreenSize() reflectively causes InaccessibleObjectException

Phil Race philip.race at oracle.com
Thu Jan 5 20:07:13 UTC 2017


Sort of .. it depends whether you could use getDeclaredMethod instead.

One question I have is, how would you update the code if you
were given the instance "foo", and need to programmatically
work out what is the correct super-type of Foo that exports
the interface method "bar" ?

i.e you don't have the string "java.awt.Toolkit" handy and
need to infer it from the instance class.

-phil.


On 01/05/2017 12:01 PM, Remi Forax wrote:
> Phil,
> This is not a new problem per se, you already had this "bug" if the returned class at runtime was a class not declared public,
> it's just more visible in the modular world of Java 9 because to be accessible a class has to be declared public *and* the package has to be exported.
>
> cheers,
> Rémi
>
> ----- Mail original -----
>> De: "Phil Race" <philip.race at oracle.com>
>> À: "Alex Buckley" <alex.buckley at oracle.com>, jigsaw-dev at openjdk.java.net, "Rony G. Flatscher" <Rony.Flatscher at wu.ac.at>
>> Envoyé: Jeudi 5 Janvier 2017 20:45:56
>> Objet: Re: Using java.awt.Toolkit.getDefaultToolkit().getScreenSize()	reflectively causes InaccessibleObjectException
>> ah yes .. I can see how one might code that way.
>> I don't know how common a problem this is, but
>> such code will need to be updated.
>>
>> ----
>> import java.awt.Toolkit;
>>
>> public class TK8 {
>>      public static void main(String args[]) throws Exception {
>>         Toolkit tk = Toolkit.getDefaultToolkit();
>>         Class tkc = tk.getClass();
>>         System.out.println(tkc);
>>         java.lang.reflect.Method m = tkc.getMethod("getScreenSize");
>>         System.out.println(m.invoke(tk));
>>      }
>> }
>>
>> ~/jdk8u45/bin/java TK8
>> class sun.awt.X11.XToolkit
>> java.awt.Dimension[width=1920,height=1200]
>>
>> ~/jdk9b142/bin/java TK8
>> class sun.awt.X11.XToolkit
>> Exception in thread "main" java.lang.NoSuchMethodException:
>> sun.awt.X11.XToolkit.getScreenSize()
>>      at java.lang.Class.getDeclaredMethod(java.base at 9-ea/Class.java:2318)
>>      at TK8.main(TK8.java:8)
>> ----
>>
>> -phil.
>>
>> On 01/05/2017 11:34 AM, Alex Buckley wrote:
>>> 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