2016-07-16 29 views
0
import java.lang.*; 
public class firstclass 
{ 
public static void main(String[] args) 
{ ClassLoader classLoader = firstclass.class.getClassLoader(); 

    System.out.println("class A is called ..."); 
     try { 
     Class x=classLoader.loadClass("secondclass"); 
     System.out.println("x has been initialized"+x); 
     //Object y=x.newInstance(); 
     //y.disp(); 
     } catch (Exception e) { 
     e.printStackTrace(); 

     } 

} 
} 

Zweiten Programm erstellt rufenWie eine Methode aus der Klasse ist Classloader mit

public class secondclass 
{ 
public void disp() 
{ 
System.out.println("Clss B is Called") 
} 
} 

, wenn ich dieses Programm ausführen, i Ausgabe als

Class A called 
x has been initializedsecondclass 

bekommen, aber wenn versuchen x.disp() oder

anrufen
Object y=x.newInstance(); 
y.disp(); 

dann bekomme ich Der Fehler als Objekt wurde nicht gefunden. Wie bekomme ich das Objekt von x zum Aufruf von disp()

+0

Ich glaube, Sie Reflexion für das in oreder benötigen – n247s

+0

arbeiten @sudoman Beachten Sie, dass das Beispiel eine statische Methode zu nennen versucht, so dass in diesem Fall die OP eine litle bit tun muss, anders . Obwohl es eine anständige Dokumentation über diese – n247s

+0

gibt, sollten Sie Ihre Notwendigkeit am Anfang des Posts ausdrücken. Es ist nicht klar. – davidxxx

Antwort

1

Die bequemste Art, dies zu tun, eine Schnittstelle mit Methode disp für beide Klassenlader zur Verfügung. Secondclass kann diese Schnittstelle implementieren und Sie können jede von der Klasse erstellte Instanz in die Schnittstelle umwandeln. Dies kann sehr praktisch mit spi gemacht werden https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

Wenn Sie eine Schnittstelle nicht verwenden können, brauchen Sie Reflexion.

Class<?> type = classLoader.loadClass("secondclass"); 
    Object instance = type.getConstructor().newInstance(); 
    type.getMethod("disp").invoke(instance);