質問:
アプリにパフォーマンス上の問題があり、ボトルネックはsun.awt.image.ImageFetcher.run
で、プロファイラーから (それ以上) 意味のある情報を取得できません。そこで、ImageFetcher が行っている仕事を見てみるのもいいだろうと考えました。
すべてのジョブFetcherInfo
を保持するクラスにアクセスできませんでした。インスタンスImageFetcher
を取得するには、 を呼び出す必要があります。FetcherInfo
FetcherInfo.getFetcherInfo()
パッケージでクラスを作成しましたsun.awt.image
(私のプロジェクトでは、rt.jarをいじりませんでした)。
私がFetcherInfo
使用するために:
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();
}
そして、私は例外を受け取ります:Exception in thread "IMAGE-FETCHER-WATCHER" java.lang.IllegalAccessError: tried to access class sun.awt.image.FetcherInfo from class sun.awt.image.FetcherDebug
また、スタック トレースは次を指しています。
for(Method method : FetcherInfo.class.getDeclaredMethods()){
同じ例外が発生しました:
FetcherInfo.class.getMethod("getFetcherInfo");
したがって、誰でも次のいずれかの方法についてアイデアを持っています。
- ImageFetcher インスタンスを取得する
- どの画像がロードされているかを調べる
解決
問題は、クラスをsun.java.awt
パッケージに入れずに、パッケージで保護されたメンバーにアクセスするためにクラスをパッケージに入れたことrt.jar
であり、呼び出し側で例外がスローされImageFetcher.class
ました。