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

Jochen Theodorou blackdrag at gmx.org
Thu Jan 5 22:09:35 UTC 2017


On 05.01.2017 21:07, Phil Race wrote:
> 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.

staying in old java style I guess something like this:

Method getMethod(Class c, String name, Class... types) {
   if (c==null) return null
   try {
     return c.getMethod(name, types)
   } catch (Exception e) {
     // ignoring exceptions is fun!
   }
   for (Class ci : c.getInterfaces()) {
     Method ret = getMethod(ci, name, types)
     if (ret!=null) return ret
   }
   return getMethod(c.getSuperClass(), name, types)
}

If the this getMethod returns a method then you should have something 
you can invoke on. Just searching the super classes is not enough, the 
only exported type might be an interfaces, so you have to go through 
those too. I leave the version with lambdas, flat-mapped streams, 
Optionals and useless generics/semicolons to somebody else ;)

I think a version using MethodHandles would be similar, since I think 
the game is the same if you use Lookup#findVirtual instead of 
Class#getMethod... only that in the end you could of course just return 
a MethodHandle that throws one (of the countless) exceptions this code 
may have produced...

I'd love to see a better solution though..

bye Jochen


More information about the jigsaw-dev mailing list