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