Доступ к закрытым классам в пакете sun.awt [в частности:FetcherInfo]
-
03-07-2019 - |
Вопрос
Вопрос:
У меня есть некоторые проблемы с производительностью в моем приложении, и узким местом является 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
, и было выброшено исключение при вызове hen 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);
}
}