Carl: Klasse indirekt aufrufen

Hallo,
ich würde gerne eine Klasse aufrufen die per STDin angegeben werden soll.

Der input wird in einen normalen String (input) konvertiert, und um ein führendes "methoden." ergänzt, da die ausführbaren klassen in einem unterordner "methoden" liegen.

so weit geht das ganze Konstrukt auch schon, ich bekomme es nur nicht auf die Reihe die Klasse zu starten.

Hier mal ein auszug:
//Input ist der Name der Klasse der Über Std.In eingegeben wurde z.B. HelloWorld
        input = "Methoden." + input;
        try {
            Class todo = null ;
            todo = todo.forName(input);
            error = false;

}
        catch (java.lang.Throwable err){
            System.out.println("Es ist ein Fehler aufgetreten:");
            System.out.println(err.toString());
        }
HelloWorld liegt also in dem unterordner "Methoden", kompostiert und lauffähig. zumindest über ein "new Methoden.HelloWorld" da ich allerdings einige klassen mehr ansprechen möchte soll das ganze dynamisch gehen.

und wie bitte bekomme ich nun das Ganze dazu mir HelloWorld auszuführen?

hier auch noch dessen Quelltext:
public class HelloWorld {
    public void HelloWorld() {
        System.out.println("HELLO WORLD!");
    }
}

Bin scheinbar zu dumm um die API zu verstehen. ;-)

Besten Dank schon mal.

Carl

  1. Hallo,

    Class todo = null ;
    todo = todo.forName(input);

    und wie bitte bekomme ich nun das Ganze dazu mir HelloWorld auszuführen?

    Laß dir von dem Class-Objekt eine Instanz der Klasse geben
    (Class.newInstance()). Danach kannst du mit dem Objekt alles machen,
    was du willst. Insbesondere auch main() aufrufen etc.

    Gruß
    Slyh

    1. Laß dir von dem Class-Objekt eine Instanz der Klasse geben
      (Class.newInstance()). Danach kannst du mit dem Objekt alles machen,

      Danke so weit,

      was du willst. Insbesondere auch main() aufrufen etc.

      aber da liegt scheinbar das Problem, das ding hat keine main.

      Gruß

      1. Hallo,

        was du willst. Insbesondere auch main() aufrufen etc.

        aber da liegt scheinbar das Problem, das ding hat keine main.

        Aha. Und weiter? Was hindert dich dran eine andere Methode aufzurufen?
        Was willst du eigentlich tun?

        Gruß
        Slyh

        1. Was willst du eigentlich tun?

          Also:

          dann mal in ganzen Sätzen. :-)

          Das Programm soll von Standard IN den namen einer Klasse bekommen (mittels System.in.read(byte[] b)).
          Da es sehr viele Klassen werden möchte ich das ganze nicht mittels Switch oder einem Suizid-ähnlichem if-else Komstrukt realisieren, sonder möglichst dynamisch.

          Sprich der String / Byte[] wird verwendet um den Namen der Aufzurufenden Klasse zu bekommen.

          Dann soll in meinem Beispiel fall ein Hello World! auf Standard out landen.

          von a nach b nach c.
          a und c funktionieren. nur b fehlt leider noch. ;-)

  2. Hallo,

    Lassen wir das mit der Eingabe erst mal weg.

    ich bekomme es nur nicht auf die Reihe die Klasse zu starten.

    Eine Klasse kann man nicht starten. Eine Klasse ist die Beschreibung eines Objektes. Dadurch, dass eine Instanz dieser Klasse aufgerufen wird, entsteht das Objekt im Speicher. Wenn Du den Namen der Klasse in einer Variable hast und damit eine Instanz der Klasse, also das dort beschreibene Objekt, aufrufen möchstest, dann geht das mit Class.newInstance(). Eine Klasse ohne Objekt ist nur ein Bauplan. Es geht also nicht ohne Objekt.

    class Main {
        public static void main(String[] args) {
            String input = "HelloWorld";
            try {
              Object o = Class.forName(input).newInstance();
            } catch (ClassNotFoundException e) {
                System.out.println(e);
            } catch (InstantiationException e) {
                System.out.println(e);
            } catch (IllegalAccessException e) {
                System.out.println(e);
            }
        }
    }

    hier auch noch dessen Quelltext:
    public class HelloWorld {
        public void HelloWorld() {

    ^Der Constructor einer Klasse gibt _nichts_ zurück, auch nicht void ;-))

    System.out.println("HELLO WORLD!");
        }
    }

    public class HelloWorld {
        HelloWorld() {
            System.out.println("HELLO WORLD!");
        }
    }

    viele Grüße

    Axel

    1. Hm, so weit so gut.
      nur leider erschein immer noch kein HELLO WORLD in meiner ausgabe.

      Ich weiß ich bin ien dummuser, aber auf die methode hier lern ich wenigstens was. *g*

      Danke jedenfalls schon mal für den Tip.

      Carl

      1. Hallo,

        Hm, so weit so gut.
        nur leider erschein immer noch kein HELLO WORLD in meiner ausgabe.

        Bei mir schon ;-))
        Also:
        Main.java:
        class Main {
            public static void main(String[] args) {
                String input = "HelloWorld";
                try {
                  Object o = Class.forName(input).newInstance();
                } catch (ClassNotFoundException e) {
                    System.out.println(e);
                } catch (InstantiationException e) {
                    System.out.println(e);
                } catch (IllegalAccessException e) {
                    System.out.println(e);
                }
            }
        }

        HelloWorld.java:
        public class HelloWorld {
            public HelloWorld() {
                System.out.println("HELLO WORLD!");
            }
        }

        Beide sind im selben Verzeichnis. Dann:
        javac HelloWorld.java
        javac Main.java

        Dann:
        java Main

        Erzeugt:
        HELLO WORLD!

        viele Grüße

        Axel

        1. Das is doch komisch:

          Habe einfach mal das ganze kopiert und bei mir eingefügt.
          1:1
          und was kommt?!

          Gar nix.

  3. was du suchst nennt sich reflection (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/package-summary.html, oder schau mal unter http://www.galileocomputing.de/openbook/javainsel2/java_210003.htm). mit dem reflection-api kannst du mit klassen deren name erst zur laufzeit bekannt wird arbeiten, also instanzen erzeugen, methoden aufrufen, etc. ist etwas kniffelig, aber wenn du mal das prinzip verstanden hast wirst du spass damit haben :-)

    gruß aus berlin, volker