java - 访问 sun.awt 包中的非公共(public)类 [特别是 : FetcherInfo]

标签 java security awt javax.imageio securitymanager

问题:

我的应用程序存在一些性能问题 - 瓶颈是 sun.awt.image.ImageFetcher.run,并且我无法从探查器中获取任何(更多)有意义的信息。所以我想看看 ImageFetcher 正在做的工作会很不错。

我无法访问包含所有 ImageFetcher 作业的 FetcherInfo 类。要获取 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();
}

我得到异常:线程“IMAGE-FETCHER-WATCHER”java.lang.IllegalAccessError中的异常:尝试从类sun.awt.image.FetcherDebug访问类sun.awt.image.FetcherInfo

堆栈跟踪指向:

for(Method method : FetcherInfo.class.getDeclaredMethods()){

同样的异常是由以下人员引发的:

 FetcherInfo.class.getMethod("getFetcherInfo");

所以任何人都有任何想法如何:

  • 获取ImageFetcher实例
  • 了解正在加载哪些图像

解决方案

问题是我已将我的类放入 sun.java.awt 包中以访问包 protected 成员,而不将其放入 rt.jar 中,调用ImageFetcher.class时抛出异常。

最佳答案

要访问不可访问的成员,请使用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);
    }
}

关于java - 访问 sun.awt 包中的非公共(public)类 [特别是 : FetcherInfo],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820334/

相关文章:

java - 如何实现LuaJ暂停?

java - Android 应用未从 SignalR 集线器接收数据

javascript - React.js 中的安全问题

java - Apache shiro 2.1 在 Tomcat 8 RC 5 中无法正常工作

java - drawString 和 Ellipse2D 兼容性问题

java - Ehcache Spring-自定义 key 生成器

java - 获取给定开始和结束日期的日期列表

java - Struts 同步器 token

java - 不带坐标的 LinearGradientPaint

java - 如何检索Applet实例