Как определить, когда атрибут изменен, вызвав методы отражения - PullRequest
5 голосов
/ 12 мая 2010

У меня есть следующий класс

public class MyClass {
   private int myAttr;

   public void setAttr(int a) { 
      myAttr = a; 
      Thread.dumpStack();
   }
}

Таким образом, я могу обнаружить любую попытку изменить myAttr. Ну почти любой. Это не работает, когда кто-то изменяет myAttr, используя метод Field.set(). Как я могу перехватить использование отражения Java?

Ответы [ 2 ]

5 голосов
/ 12 мая 2010

Вы не можете. Вы находитесь во власти SecurityManager, если кто-то рядом, чтобы помешать кому-либо делать с вами неприятные вещи.

Смежный вопрос

1 голос
/ 12 мая 2010

Сначала вам нужно спросить себя, что вас здесь действительно беспокоит. Конечно - если кто-то действительно хочет, они могут подорвать ваш стек трассировщик. Но почему тебя это действительно волнует? И если вам действительно все равно, почему вы вообще готовы запускать их код?

Если вам действительно нужно это сделать, вам нужно создать изолированную программную среду безопасности, в которой будет выполняться код, который может подорвать трассировщик стека. В частности, вам нужно создать менеджер безопасности, для которого

    securityManager.checkPermission(ReflectPermission("suppressAccessChecks"))

выдаст SecurityException для ненадежного кода. Затем вы создаете новый загрузчик классов с помощью менеджера безопасности.

К сожалению, похоже, нет способа ограничить setAccessible(...) для определенных target полей, методов или классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...