FAQ

 
 
 
Сообщения:9474
Содержание
<E> как определить тип E?
Сканирование аннотаций в классах
Лукавый setAccessible(true)
Изменен:23 дек 2010 07:56
 
 
Сообщения:9474
<E> как определить тип E?

Параметризация в Java происходит в рантайме, таким образом в коде вы никак не можете определить тип параметра.
Единственное, что можно сделать, - передать тип в конструктор:
class MyClass<T> {
   private Class<T> type;
   public MyClass(Class<T> cl) {
       type = cl;
   }
}
Для более хитрозадых есть эта статья, которая позволит определить статически установленный Т (например extends MyClass<SomeClass>).
Изменен:16 дек 2012 16:47
 
 
Сообщения:9474
О setAccessible(true)

Для многих метод setAccessible(true) может показаться очень привлекательным, т.к.
  • Он увеличивает производительность. Например, есть у нас Method#invoke(), если ему установить setAccessible(true), то он не будет проверять имеет ли доступ вызывающий код к методу. Подробдней - здесь (спасибо Vermut'у)
  • Он позволяет обращаться к приватным членам класса
Однако использовать этот метод нельзя, если вы собираетесь свое приложение запускать с сильно ограничивающим SecurityManager'ом (он например присутсвует при запуске апплетов).
Итак, давайте по-порядку: во-первых у Java определена такая штука, как SecurityManager, который контроллирует очень многое - от обращения к файлам, до работы со стандартным логгером. В его же обязанности входит проверка "а не пытается ли кто-нибудь установить setAccessible(true)", это важно, т.к. когда хостер принимает ваше приложение, откуда ему знать, что оно не похакает сам Томкат? Если SecurityManager установлен и при этом suppressAccessChecks=false, то вы получите SecurityException, подробней - здесь.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет