2016-04-09 8 views
3

Ich habe den folgenden Code den Standard URLStreamHandlers für HTTP und HTTPS, die in Java 8 durch den Zugriff auf die statische Paket URL.getURLStreamHandler() scoped Methode funktioniert abzurufen:Ist es möglich, durch Reflexion in Java 9 mit Jigsaw auf paketorientierte Methoden zuzugreifen?

private URLStreamHandler getURLStreamHandler(String protocol) { 
    try { 
     Method method = URL.class.getDeclaredMethod("getURLStreamHandler", String.class); 
     method.setAccessible(true); 
     return (URLStreamHandler) method.invoke(null, protocol); 
    } catch (Exception e) { 
     logger.warning("could not access URL.getUrlStreamHandler"); 
     return null; 
    } 
} 

Wird dies noch möglich sein, in Java 9 mit jigsaw oder wird modifiziert die Sichtbarkeit auf diese Weise verboten sein?

+0

Die Möglichkeit, auf sie über eine Zugriffsüberschreibung zuzugreifen, kann existieren, aber da package-private Methoden nicht Teil der offiziellen API sind, gibt es keine Garantie, dass die Methode überhaupt existiert ... – Holger

Antwort

4

Früher war es in einem frühen Prototyp möglich, aber nicht mehr. Die Zugriffsregeln von Jigsaw beschränken nun den Zugriff nur auf public Elemente (Typen, Methoden, Felder).

In Ihrem Beispiel der Aufruf an method.setAccessible(true) wird mit einer Meldung fehlschlagen ähnlich wie diese:

java.lang.reflect.InaccessibleObjectException: Kann nicht getURLStreamHandler zugänglich machen: Modul java .... nicht " öffnet java ....“ungenannten Modul @ 1941a8ff

this question für sehen Sie, wie um daran zu arbeiten.