Метод доступа к отражению Java с модификатором по умолчанию в суперклассе - PullRequest
5 голосов
/ 20 января 2010

Можно ли вызвать метод без модификатора в суперклассе через отражение Java?

Ответы [ 3 ]

7 голосов
/ 20 января 2010
Method method = getClass().getSuperclass().getDeclaredMethod("doSomething");
method.invoke(this);

если у вас большая иерархия, вы можете использовать:

Class current = getClass();
Method method = null;
while (current != Object.class) {
     try {
          method = current.getDeclaredMethod("doSomething");
          break;
     } catch (NoSuchMethodException ex) {
          current = current.getSuperclass();
     }
}
// only needed if the two classes are in different packages
method.setAccessible(true); 
method.invoke(this);

(приведенные выше примеры для метода с именем doSomething без аргументов. Если у вашего метода есть аргументы, вы должны добавить их типы в качестве аргументов в метод getDeclaredMethod(...))

4 голосов
/ 29 июня 2010

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

Я не думаю, что вызов переопределенного метода возможен, для

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

Наиболее заметно:

Method.invoke

Если базовый метод является методом экземпляра, он вызывается с использованием динамического поиска метода, как описано в Спецификации языка Java, второе издание, раздел 15.12.4.4; в частности, произойдет переопределение на основе типа времени выполнения целевого объекта.

1 голос
/ 20 января 2010

Да. Возможно, вам придется вызвать setAccessible (true) для объекта Method, прежде чем вызывать его.

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