Как вызвать родительский частный метод из дочернего?
public class A{
private int getC(){
return 0;
}
}
public class B extends A{
public static void main(String args[]){
B = new B();
//here I need to invoke getC()
}
}
Не могли бы вы рассказать мне, можно ли сделать сухую вещь через отражение в java?
Ответы
Ответ 1
class A{
private void a(){
System.out.println("private of A called");
}
}
class B extends A{
public void callAa(){
try {
System.out.println(Arrays.toString(getClass().getSuperclass().getMethods()));
Method m = getClass().getSuperclass().getDeclaredMethod("a", new Class<?>[]{});
m.setAccessible(true);
m.invoke(this, (Object[])null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ответ 2
Вы можете сделать это с помощью рефлексии, но, если для этого нет веских оснований, вы должны сначала пересмотреть свой дизайн.
Код ниже печатает 123, даже если вызывается извне A.
public static void main(String[] args) throws Exception {
Method m = A.class.getDeclaredMethod("getC");
m.setAccessible(true); //bypasses the private modifier
int i = (Integer) m.invoke(new A());
System.out.println("i = " + i); //prints 123
}
public static class A {
private int getC() {
return 123;
}
}
Ответ 3
Вы должны объявить getc защищенным. Это именно то, ради чего.
Что касается отражения: Да, это возможно. Однако вам придется вызвать setAccessible на объект метода. И это плохой стиль...; -)
Ответ 4
getDeclaredMethod будет возвращать только частные методы в текущем классе, а не унаследованные методы. Чтобы достичь этого, вам нужно ориентироваться в графике наследования с помощью метода getSuperclass. Вот фрагмент кода, который делает это
private Method getPrivateMethod(Object currentObject) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> currentClass = currentObject.getClass();
Method method = null;
while (currentClass != null && method == null) {
try {
method = currentClass.getDeclaredMethod("getC");
} catch (NoSuchMethodException nsme) {
// method not present - try super class
currentClass = currentClass.getSuperclass();
}
}
if (method != null) {
method.setAccessible(true);
return method;
} else {
throw new NoSuchMethodException();
}
}
Ответ 5
вы можете попробовать это, используя отражение:
Method getCMethod = A.class.getDeclaredMethod("getC");
getCMethod.setAccessible(true);
getCMethod.invoke(new A());