Zugang nicht-öffentliche Klassen in sun.awt Paket [speziell: FetcherInfo]
-
03-07-2019 - |
Frage
Frage:
Ich habe einige Performance-Probleme in meiner app - und der Engpass ist sun.awt.image.ImageFetcher.run
, und ich canno't alle (mehr) meaningfull Infos von Profiler zu erhalten. Also dachte ich, dass es schön wäre, um Jobs zu suchen, dass ImageFetcher tut.
Ich kann keinen Zugang zu FetcherInfo
Klasse erhalten, die alle ImageFetcher
Jobs hält. Um FetcherInfo
Instanz zu erhalten Ich habe FetcherInfo.getFetcherInfo()
zu nennen.
Ich habe Klasse im Paket sun.awt.image
(nur in meinem Projekt, den Ball hielt ich bastelt mit rt.jar).
Um FetcherInfo
i verwenden:
try{
for(Method method : FetcherInfo.class.getDeclaredMethods()){
method.setAccessible(true);
if(method.getName().equals("getFetcherInfo")){
m = method;
}
}
}catch (Exception e){
e.printStackTrace();
}
FetcherInfo info = null;
try {
info = (FetcherInfo) m.invoke(null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Und ich Ausnahme: Exception in thread "IMAGE-FETCHER-WATCHER" java.lang.IllegalAccessError: tried to access class sun.awt.image.FetcherInfo from class sun.awt.image.FetcherDebug
Und die Stack-Trace Punkte auf:
for(Method method : FetcherInfo.class.getDeclaredMethods()){
Die gleiche Ausnahme wurde erhöht durch:
FetcherInfo.class.getMethod("getFetcherInfo");
So jemand irgendwelche Ideen, wie man entweder:
- Erhalten ImageFetcher Instanz
- Finden Sie heraus, welche Bilder werden immer geladen
SOLUTION
Das Problem war, dass ich meine Klasse in sun.java.awt
Paket geschnürt haben Zugang zu erhalten geschützte Mitglieder zu verpacken, ohne sie in rt.jar
zu setzen und wurde Ausnahme ausgelöst Henne ImageFetcher.class
aufrufen.
Lösung
Für den Zugriff auf nicht zugängliche Mitglieder nutzen setAccessible(true)
. (Ohne einen Sicherheitsmanager vorhanden ist, gibt es keinen Block auf sun.*
Klassen mit Reflexion verwendet werden.)
import java.lang.reflect.Method;
public class Access {
public static void main(String[] args) throws Exception {
Class<?> imageFetcher = Class.forName("sun.awt.image.FetcherInfo");
for (Method method : imageFetcher.getDeclaredMethods()) {
;
}
Method method = imageFetcher.getDeclaredMethod("getFetcherInfo");
method.setAccessible(true);
Object fetcher = method.invoke(null);
System.err.println(fetcher);
}
}