2013-07-11 1 views
1

Я использую этот метод, чтобы удалить Html код из моих String с в классах:Отражение в inhertited классов

public void filterStrings() { 

    Field[] fields = this.getClass().getDeclaredFields(); 

    if (fields == null) { 
     return; 
    } 

    for (Field f : fields) { 

     if (f.getType() == java.lang.String.class) { 

      try { 

       String value = (String) f.get(this); 

       f.set(this, methodToRemoveHtml(value)); 

      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

} 

работает отлично. Поскольку я поймал себя на том, что ставил этот метод во многих классах, которые я использую, я думал, что позволю всем этим классам наследовать из BaseClass и реализовать метод только там. Но когда я это делаю, я получаю:java.lang.IllegalAccessException: access to field not allowed на каждой попытке.

  1. Почему это происходит и
  2. Как я могу это исправить?
+0

[setAccessible] (http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible (boolean)) –

ответ

1

Я думаю, что поля являются частными, поэтому их можно получить только из кода внутри класса, который содержит их, а не для суперкласса.

Вы должны сделать их доступными, позвонив по телефону setAccessible(true); или сделав их общедоступными или защищенными.

for (Field f : fields) { 

     if (f.getType() == java.lang.String.class) { 

      try { 
       f.setAccessible(true); // make field accessible. 
       String value = (String) f.get(this); 
       // ... 
+0

Да, это работает, спасибо вам большое , Я соглашусь через несколько минут. – FWeigl

1

Может быть вам нужно позвонить: f.setAccessible (истинное);

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