2012-01-28 8 views
10

Sechiamata dato un oggetto di classe in Java

class MyClass { 
    public static void main(String[] str) { 
     System.out.println("hello world"); 
    } 
} 

// in some other file and method 
Class klass = Class.forName("MyClass"); 

Come posso chiamare MyClass.main? Non ho la stringa "MyClass" al momento della compilazione, quindi non posso semplicemente chiamare MyClass.main(String[]{}).

+0

Riflesso e caricamento della classe possono farlo. Puoi dirci la motivazione dietro a questo? –

risposta

29

È possibile utilizzare reflection per richiamare metodi (o creare oggetti, ecc.). Di seguito è riportato un esempio per richiamare il metodo main() in MyClass. Tutto quello che devi fare è assicurarti che MyClass sia nel classpath.

Class<?> cls = Class.forName("MyClass"); 
Method m = cls.getMethod("main", String[].class); 
String[] params = null; 
m.invoke(null, (Object) params); 
+8

NON chiamerei un metodo entry point 'main' passandogli un argomento' null'. L'launcher 'java' chiama' main' con un array vuoto se non ci sono argomenti della riga di comando, e la maggior parte dei metodi 'main' non si preoccupano di controllare' null'. –

+0

@StephenC thanx per le informazioni su java launcher. Non lo sapevo. –

-6

Se non si hanno le "MyClass" stringa in fase di compilazione, quindi in qualche modo bisogno di guardare in su, modi comuni che i quadri di uso per fare questo:

  • configurare un .properties o file xml dove troverai il nome della classe che ti serve.
  • scansiona la directory corrente per i file .class che corrispondono ai tuoi criteri.
  • scan .jar file per file .class corrispondenti ai tuoi criteri.
+0

No. Scusa, non sai cosa sto facendo --- non c'è assolutamente modo per me di ottenere la stringa MyClass in fase di compilazione. –

+0

Questo è * preciso * quello che sto raccomandando, è necessario dipendere da qualche altra fonte di informazione (un file xml) dove è configurata la stringa MyClass, o è necessario eseguire la scansione dei file di classe (diciamo ogni classe con una statica principale metodo) in RUNTIME. –

+0

Oh --- hai frainteso la mia domanda allora. Non si tratta di ottenere la stringa, si tratta di chiamare un metodo statico sulla classe il cui nome corrisponde alla stringa. –

Problemi correlati