问题:
我的应用中存在一些性能问题 - 瓶颈是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");
所以任何人都有任何想法如何:
解
问题是我已经将我的类放入sun.java.awt
包中以获取对受保护包的成员的访问权限,而不将其放入rt.jar
,并且异常被抛出母鸡调用ImageFetcher.class
。
答案 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);
}
}