2012-05-18 5 views
2

Я искал решение без везения, вот что у меня есть и чего я пытаюсь достичьДоступ к защищенному методу родительского класса извне дочернего класса (с отражением или что-нибудь, что сработает)

родитель Класс

public abstract class MyAbstractParentClass{ 
    private String privateParentField; 

    protected String getPrivateParentField(){ 
      return privateParentField; 
    } 

    public void setField(String value){ 
      privateParentField = value; 
    } 
} 

Детский класс

public class MyChlidClass extends MyAbstractParentClass{ 
    @Override 
    public void setField(String value){ 
      super.setField(value); 
    } 
} 

Я стараюсь чтобы вызвать метод MyChlidClasssetField, а затем называть MyAbstractParentClassprotected String getPrivateParentField() послесловиями;

@Test 
public void f(){ 
    Method[] m = MyChlidClass.class.getDeclaredMethods(); 
    for (Method method : m) { 
     System.out.println(method.getName()); 
    } 
} 

Но этот код выше возвращается только декларировал методы MyChlidClass без protected тех родительского класса, то как я могу получить доступ к защищенному методу? есть идеи?

большое спасибо заранее :)

EDIT Вот окончательное решение для тех, кто заинтересован

MyChildClass child = new MyChildClass(); 
chlid.setField("FOO_BAR"); 

Method getPrivateParentField = child.getClass().getSuperclass().getDeclaredMethod("getPrivateParentField"); 
getPrivateParentField.setAccessible(true); 

String result = (String) getPrivateParentField.invoke(child); 
System.out.println((String)result); //prints out FOO_BAR 

PS: Есть несколько исключений вы можете либо поймать или добавить бросками декларацию для них ;

еще раз спасибо за вашу помощь

+0

Использование 'Override' без каких-либо расширений? И почему вы хотели бы переопределить метод setter? Разве это явно ничего не меняется? – Crazenezz

+0

@Grazenezz: извините, я просто забыл написать расширения, и это всего лишь пример (достаточно простой), чтобы сделать то, что я хочу достичь, спасибо за указатель на ошибку :) – snajahi

+0

@ K-SaMa какая структура пакета как ? пожалуйста, поделитесь этой информацией –

ответ

5

Вы можете получить методы суперкласса по телефону

MyChlidClass.class.getSuperclass().getDeclaredMethods(); 
+0

Спасибо большое, только то, что мне нужно :) – snajahi

+0

приветствуются – mprabhat

1

Вы можете увеличить видимость при расширении класса. Вам не нужно, чтобы изменить код MyChlidClass, вы можете просто продлить его:

public class MyGrandChlidClass extends MyChlidClass{ 

    @Override 
    public String getPrivateParentField(){ 
      return super.getPrivateParentField(); 
    } 
} 

@Test 
public void f(){ 
    MyGrandChlidClass myGrandChlidClass = new MyGrandChlidClass(); 
    myGrandChlidClass.setField("hello"); 
    System.out.println(myGrandChlidClass.getPrivateParentField()); 
} 
+0

, очевидно, что это сработает, но мне не разрешено изменять код; – snajahi

+0

@ K-SaMa Тогда вы могли бы расширить дочерний класс другим подклассом? Таким образом, вы не меняете MyAbstractParentClass или код MyChlidClass. – Pablo

0

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

0

Использование getDeclaredMethods() на родительском классе, чтобы получить информацию о защищенных методов родительских классов.