Доступ к закрытым классам в пакете sun.awt [в частности: FetcherInfo] - PullRequest
0 голосов
/ 04 мая 2009

Вопрос:

У меня есть проблема с производительностью в моем приложении - узким местом является 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, и было вызвано исключение при вызове ImageFetcher.class.

1 Ответ

2 голосов
/ 04 мая 2009

Для доступа к недоступным пользователям используйте 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);
    }
}
...