2013-01-22 4 views
8

У меня есть 2 классов, скажем, A & B:методы класса Invoke Супер с помощью отражения

Class A extends B { 
    public void subClassMthd(){ 
     System.out.println("Hello"); 
    } 
} 

Class B { 
    public void printHelloWorld { 
     System.out.println("Hello"); 
    } 
} 

Теперь я использую отражение для вызова методов в классе А. Я хотел бы также, чтобы вызвать метод, присутствующий printHelloWorld в классе B.

Я попытался с помощью

Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Method superClassmthd = classAInstance.getClass() 
    .getSuperclass().getMethod("printHelloWorld", null); 
superClassmthd.invoke(classAInstance); 

также пытались, как

Class clazz = Class.forName("com.test.ClassA"); 
Object classAInstance= clazz.newInstance(); 
Class superClazz = Class.forName(classAInstance.getClass().getSuperclass().getName()); 
Object superclassInstance = superClazz.newInstance(); 
Method superClassmthd = superclassInstance.getMethod("printHelloWorld", null); 
superClassmthd.invoke(superclassInstance); 

Но никто из них не работает; они бросают InstantiationException.

Что я здесь делаю неправильно?

+0

Это не ясно, что вы пытаетесь сделать именно потому, что код предоставили не имеет никакого смысла. Не могли бы вы дать более подробную информацию о том, что вы пытаетесь сделать? –

+0

При попытке создать новый экземпляр класса, а не при вызове обычных методов, может возникнуть исключение InstantiationException. Вы уверены, что ищете правильное место для решения проблемы? – jarnbjo

+0

Можете ли вы предоставить Stacktrace исключения и код из метода в классе B и (если он существует) переопределенные и/или перегруженные методы из класса A? Подписи методов достаточно - нет необходимости в полном внутреннем методе кода. –

ответ

15

Попробуйте это:

Method mthd = classAInstance.getClass().getSuperclass().getDeclaredMethod("XYZ"); 
mthd.invoke(classAInstance) 

Разница использует getDeclaredMethod(), который получает методы всех ограниченной видимости (public, protected, упаковка/по умолчанию и private) вместо getMethod(), который только получает методы с public видимости ,

+0

Спасибо, это сработало – Vivek

+0

Это вызовет метод XYZ класса ClassInInstance. Я просто протестировал его, и он не вызывал только super.XYZ() класса. –

+2

@ user951793, если супер-метод переопределяется классом экземпляра (а не ситуацией в этом вопросе), тогда, конечно, будет вызван переопределенный метод - это поведение является ядром ООП. – Bohemian

2

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

Кроме того, каковы конструкторы ваших классов? InstantiationException указывает, что у вас возникли проблемы с получением экземпляра класса A (или B).

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

A.java

import java.lang.reflect.Method; 

public class A extends B { 

    public static void main(String[] args) throws Exception { 
     A classAInstance = new A(); 
     Method mthd = classAInstance.getClass().getSuperclass().getMethod("XYZ", null); 
     mthd.invoke(classAInstance); 
    } 

} 

B.java

public class B { 

    public void XYZ() { 
     System.out.println("done"); 
    } 

} 
+0

Спасибо, этот совет тоже сработал для меня. – Vivek

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