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