2013-01-22 7 views
8

Ich habe 2 Klassen, sagen wir ein & B:Invoke Super-Klasse Methoden Reflection

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

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

Nun, ich bin mit Reflexion der Methoden auf der Klasse A. aufrufen würde ich auch die printHelloWorld Methode vorhanden aufrufen möchte in Klasse B.

ich versuchte

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

auch versucht als

mit 0
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); 

Aber keiner von ihnen funktioniert; sie werfen eine InstantiationException.

Was mache ich hier falsch?

+0

Es ist nicht klar, was Sie versuchen genau das zu tun, weil der Code, den Sie haben zur Verfügung gestellt macht keinen Sinn. Könntest du mehr Details darüber geben, was du zu tun versuchst? –

+0

Eine InstantiationException kann ausgelöst werden, wenn Sie versuchen, eine neue Instanz einer Klasse zu erstellen, nicht beim Aufrufen regulärer Methoden. Sind Sie sicher, dass Sie den richtigen Ort suchen, um das Problem zu lösen? – jarnbjo

+0

Können Sie die Exception Stacktrace und den Code von Methode in Klasse B und (falls vorhanden) die überschriebenen und/oder überladenen Methoden aus Klasse A bereitstellen? Die Signaturen der Methoden sind ausreichend - es ist kein vollständiger innerer Methodencode erforderlich. –

Antwort

15

Dieses versuchen:

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

Der Unterschied getDeclaredMethod() verwendet, die Methoden der allen visibilities gets (public, protected, Paket-/default und private) anstelle von getMethod(), die nur Methoden mit public Sichtbarkeit erhält .

+0

Danke, das hat funktioniert – Vivek

+0

Dies wird classAInstance XYZ-Methode aufrufen. Ich habe es gerade getestet und es hat nicht nur classAInstance super.XYZ() aufgerufen. –

+2

@ user951793 Wenn die Super-Methode von der Klasse der Instanz überschrieben wird (nicht die Situation in dieser Frage), dann wird natürlich die überschriebene Methode aufgerufen - dieses Verhalten ist der Kern von OOP. – Bohemian

2

Welche Sichtbarkeit haben die Methoden, die Sie aufrufen möchten (öffentlich, privat usw.)? Wenn Sie Methoden sehen möchten, die Sie nicht direkt aufrufen können, sollten Sie getDeclaredMethod() verwenden.

Auch was die Konstruktoren Ihrer Klassen mögen? InstantiationException gibt an, dass Sie Probleme beim Abrufen einer Instanz der Klasse A (oder B) haben.

Ich habe den folgenden Code und es funktioniert:

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

Danke, dieser Tipp hat auch für mich geklappt. – Vivek

Verwandte Themen