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.r...@oracle.com> > À: "Alex Buckley" <alex.buck...@oracle.com>, jigsaw-dev@openjdk.java.net, > "Rony G. Flatscher" <rony.flatsc...@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@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 >>>>>