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.

War es hilfreich?

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top