0

質問:

アプリにパフォーマンス上の問題があり、ボトルネックはsun.awt.image.ImageFetcher.runで、プロファイラーから (それ以上) 意味のある情報を取得できません。そこで、ImageFetcher が行っている仕事を見てみるのもいいだろうと考えました。

すべてのジョブFetcherInfoを保持するクラスにアクセスできませんでした。インスタンスImageFetcherを取得するには、 を呼び出す必要があります。FetcherInfoFetcherInfo.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ました。

4

1 に答える 1

2

アクセスできないメンバーにアクセスするには、 を使用しますsetAccessible(true)。(セキュリティ マネージャーが存在しない場合、sun.*クラスがリフレクションで使用されるのをブロックすることはありません。)

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);
    }
}
于 2009-05-04T15:38:33.653 に答える