# Klasse dynamisch über main-Methode aufrufen



## ERROR 404 (9. Jun 2004)

Hallo Leute,

ich habe ein Programm aus zwei Klassen geschrieben eine davon CErste wo main Methode implementiert  ist, ich möchte jetz die zweite  Klasse CZweite dynamisch über args[0] aufrufen, also ich gebe in der  Konsole name von  meine zweite Klasse und möchte dass diese Klasse gestartet wird.

für die Antworten danke ich im Voraus

Roman


----------



## Roar (9. Jun 2004)

Das geht per reflection (java.lang.reflect)

z.B. so:

```
Class c = Class.forName(args[0]);
Method m = c.getMethod("main", new String[]{});
Object o = m.invoke(null, new String[]{"args1", "arg2"});
```

für weitere erklärungen guck in die API, is ausführlich beschrieben.

edit: achja, keine garantie für richtigkeit, is jetz nru so dahingehackt...


----------



## Illuvatar (9. Jun 2004)

Roar hat gesagt.:
			
		

> Das geht per reflection (java.lang.reflect)
> 
> z.B. so:
> 
> ...



Hi hi, falsch :noe:    (Das ist die "Rache" für vorhin im Chat)


```
Class c = Class.forName(args[0]);
Method m = c.getMethod("main", new Class[]{String.class});
Object o = m.invoke(null, new Object[]{"arg1", "arg2"});
```


----------



## Roar (9. Jun 2004)

von mir aus, dann ahlt ein Class array *zicke*  :bae:


----------



## DP (9. Jun 2004)

hmmmm... kann ich damit nur neue objekte erzeugen oder so auch auf lebende zugreifen?


----------



## Roar (9. Jun 2004)

ääh... natürlich auch auf lebende. Object.getClass(); liefert dir das benötigte class objekt.


----------



## Illuvatar (9. Jun 2004)

Ähem, sicher, aber dieses Class-Objekt hat dann nocht mehr viel mit dem alten Objekt zu tun, wie das bei Class-Objekten halt so ist.
Du kannst als ersten Parameter der invoke-Methode das Objekt übergeben, auf dem sie ausgeführt werden soll. Bloß muss bei der main-Methode, da sie statisch, also Klassen- und nicht Objektgebunden ist, null übergeben werden.

Wenn du die main-Methode der Klasse, zu der ein Objekt gehört, aufrufen willst, nimmst du eben das getClass(), wie Roar es beschrieben hat, bloß seh ich keine sinnvolle Anwendung davon.


----------



## Roar (9. Jun 2004)

Illuvatar hat gesagt.:
			
		

> Wenn du die main-Methode der Klasse, zu der ein Objekt gehört, aufrufen willst, nimmst du eben das getClass(), wie Roar es beschrieben hat, bloß seh ich keine sinnvolle Anwendung davon.



och.. was is zum beispiel wenn man während der laufzeit herausfinden will welche methoden die klasse hat? gut ich wüsste kein beispiel wo das sinnvoll wäre, zum debugging vielleicht. aber soo unnütz ist es bestimmt nicht...


----------



## ERROR 404 (10. Jun 2004)

Danke Leute für eure Mühe aber es leuft bei mir trotzdem nicht    

hier ist die code


```
public void actionPerformed(ActionEvent event)
	{
           
           String cmd=event.getActionCommand();
           klass_aufruf(cmd);
	}

        public void klass_aufruf(String funk_nummer)
        {

           String abfrage="SELECT CLASS_NA FROM SYS_CLASSEN WHERE CLASS_NR LIKE '"+funk_nummer+"' ";
           String[] class_na=new String[10];

             try{
                      result3=gl_datenbank1.statement1.executeQuery(abfrage);
                      while(result3.next())
                      {
                      class_na[0]=result3.getString("CLASS_NA");
                      }
                }

                catch(SQLException s){System.out.println("Fehler  bei Abfrage "+s);}

                try{
                     Class c = Class.forName(funktion_na[0]);//Hier meldet er mir eine Fehler ClassNotFoundException
                     Method m = c.getMethod("class_aufruf", new Class[]{String.class});//Hie habe ich überhaupt  nicht  verstand wie es gehen soll
                     Object o = m.invoke(null, new Object[]{"arg1", "arg2"});//hier auch
                    }

                    catch(ClassNotFoundException cl){System.out.println(cl);}
                    catch(NoSuchMethodException me){System.out.println(me);}
                    catch(InvocationTargetException in){System.out.println(in);}
                    catch(IllegalAccessException il){System.out.println(il);}
        }
```

Danke im Voraus


----------



## Illuvatar (10. Jun 2004)

Wenn eine ClassNotFoundException geworfen wird, heißt es, dass es keine Klasse gibt, die so heißt wie function_na[0]. Leider verstehe ich das SQL-Zeug davor nicht.

```
c.getMethod("class_aufruf", new Class[]{String.class});
```
Class#getMethod, der erste Parameter gibt den Methodennamen an, der zweite ist ein Class-Array und gibt an, welche Parameter die Methode haben soll.

```
m.invoke(null, new Object[]{"arg1", "arg2"});
```
Method#invoke, ruft die Methode auf dem Objekt auf, das als erster Parameter übergeben wird, bei static Methoden muss null übergeben werden. Der zweite Parameter ist ein Object-Array, das die übergebenen Parameter an die Methode darstellt. Die Methode gibt das zurück, was die aufgerufene Methode zurückgibt.

PS: Weiß eigentlich jemand, wie Reflection mit varargs funktioniert?


----------

