Доступ к закрытым классам в пакете sun.awt [в частности:FetcherInfo]

StackOverflow https://stackoverflow.com/questions/820334

Вопрос

Вопрос:

У меня есть некоторые проблемы с производительностью в моем приложении, и узким местом является 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top