java class aus java Program starten??



  • Hi

    ich möchte aus einem Java Program ein Objekt einer anderen beliebigen Klasse erstellen.
    Im "Mainprogramm" habe ich eine GUI mit einem Fileopener in dem der User eine "*.class" Datei auswählen soll. Dann soll überprüft werden ob diese class Datei vom Typ JFrame ist und wenn ja soll eine Instanz davon erstellt und abngezeigt werden.

    Ich kann nicht runtime.exec verwenden da ich mich ja nicht auf eine main() in der klasse verlassen kann.

    Ich müsste also irgendwie den Konstruktor einer Klasse aufrufen dessen Namen ich zur compile Zeit noch nicht kenne...

    geht das?



  • hmm *selbehelf* . Unter Reflection müsste ich doch alles finden was ich dazu brauche oder?



  • Unter Reflection müsste ich doch alles finden was ich dazu brauche oder?

    Definitiv - Ja.

    Du musst dir ein Objekt der Klasse besorgen (Class.forName()). (zuerst überprüfen ob Subklasse von JFrame) und dann eben den Konstruktor aufrufen und setVisible(true)...



  • Hi

    so habe mich mal kurz belesen und bin doch auf ein kleines Problem gestoßen.

    Über Class c = Class.forName( "klassenName" );

    komme ich ja das Class Objekt wenn ich nur den KlassenName habe. Dieser muss aber mit der vollständigen Package Hierarchie angegeben werden: z.b. java.util.Vector
    Ich bekomme über mein Fileopener aber nur den direkten Klassennamen also Vector.class mitgeteilt. Wie komme ich an die package Hierarchie?

    thx!



  • Ich denke hier kann ClassLoader.defineClass(String name, byte[] b, int off, int len) helfen...



  • destruct0r schrieb:

    Ich denke hier kann ClassLoader.defineClass(String name, byte[] b, int off, int len) helfen...

    hmm und wie? Muss ich die einglesene file über nen output stream in ein Array of bytes packen und dann danach suchen mit der defineClass Function.. Wo sucht er denn da die ganze platte durch oder muss ich dann auch noch irgendwo den CLASSPATH setzen....

    könnte ich nicht irgendwie die datei anschaun und die zeile package interpretieren..

    Danke schon mal!



  • hoi

    also erstmal habe ich es quasi geschafft mittels

    ClassLoader.defineClass(String name, byte[] b, int off, int len)

    ein Class Onject zu bekommen. auch defineClass erwartet als name den kompletten Name mit package declaration aber wenn man null einträgt gehts auch.

    Beim erstellen einer Instanz aus dem erlangten Konstruktor bekomme ich nun folgenden Fehler:

    InvocationTargetException java.lang.IllegalAccessError: tried to access class com.blauton.demo.Transformation_jButton1_actionAdapter from class com.blauton.demo.twoButtons

    in der twoButtons class wird tatsächlich 🙂 ein transformationDemo_jButton1_actionAdapter Object erzeugt. Warum soll er das nicht dürfen?

    Was muss ich machen das meine über Classloader gestarteten klassen wiederum objecte anderer klassen erstellen dürfen? Muss ich vielleicht noch irgendwelche Packages includieren? Wie mache ich das..



  • Naja es könnte ja sein, dass die Klasse, die du geladen hast nicht als public deklariert ist. In diesem Fall darfst du, wenn du nicht im selben Paket bist keine Objekte davon erstellen.
    Prüfe also nach, ob die Klasse, die du nicht laden kannst public ist oder nicht.



  • destruct0r schrieb:

    Naja es könnte ja sein, dass die Klasse, die du geladen hast nicht als public deklariert ist. In diesem Fall darfst du, wenn du nicht im selben Paket bist keine Objekte davon erstellen.
    Prüfe also nach, ob die Klasse, die du nicht laden kannst public ist oder nicht.

    Hi, etwas späte Antwort, aber trotzdem erstmal Danke.

    Folgendes: Die twoButtons.class ist public, dürfte also kein Problem machen. Allerdings hat die twoButtons.class innerclasses ala :

    class TransformationDemo_jButton1_actionAdapter impelments java.awt.event.ActionListener

    Diese Klassen sind nicht public (da inner classes) und machen obige Probleme beim instanziieren. Eigentlich komisch weil diese innerklassen ja nicht von aussen sondern von der outerclass instanziiert werden.

    hat jemand ne idee?



  • Hi

    das programm besteht ja aus mehreren Klassen. wenn du nur eine klasse dem laufzeitsystem bekant machst, und diese andere klassen des paketes benutzt sind dies ja nicht der vm bekant und die liefert dann so komische fehler wie Class not found exeption . du müstest somit erst nach den verwendeten klassen suchen und diese der vm bekantmachen befor du das fenster ausführst. ( nur ob das so ohne weiteres funktioniert weis ich nicht )

    gruss Termite


Anmelden zum Antworten