0

问题:

我的应用程序存在一些性能问题 - 瓶颈是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

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 回答