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.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