访问sun.awt包中的非公共类[具体来说:FetcherInfo]

时间:2009-05-04 14:23:49

标签: java security awt javax.imageio securitymanager

问题:

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

1 个答案:

答案 0 :(得分: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);
    }
}