Frage zum dynamischen Klassen laden

Status
Nicht offen für weitere Antworten.

Marfir

Aktives Mitglied
Hallo,

ich wollt wärend der Laufzeit mein Programm durch eine "neuere" Version austauschen.
Dazu habe ich einmal das Orginalprogramm und davon eine Kopie mit einem zusätzlichen Button auf dem JFrame.

Die Probleme:
1.
Anstatt die neue Version aus dem Internet zu laden, passiert nix (also ich sehe mein JFrame unverändert).
Wenn ich mir ausgeben lasse (.toString()), was c ist, dann ist es genau das JFrame, mit dem ich starte. Aber es müsste doch das andere (neuere) sein?!

2.
Keine Fehlermeldung, aber die Erfolgsmeldung erscheint. Also irgend was mach ich falsch. Nur was?

Code:
static Object ladeKlasse (String pfad, String klassenname) throws Exception
    {
        //klassen laden und neue instanz zurückgeben
        System.out.println(pfad + ", " + klassenname);
        URL url = new URL(pfad);
        URLClassLoader cl = new URLClassLoader(new URL[]{url});
        Class c = cl.loadClass(klassenname);
        System.out.println("ladeKlasse(): laden erfolgreich!");
        ausgabe.append("Das Programm ist erfolgreich aktualisiert wurden!\n");
        
        return c.newInstance();
    }


Das Programm läuft dann auch normal weiter.
(teil des Programms🙂

Code:
n=jOptionPane1.showConfirmDialog(this, "Es ist eine neue Version (" + versioninet + ") verfügbar! Wollen Sie Ihre Version jetzt updaten?");
                    if (n==jOptionPane1.YES_OPTION)
                    {
                        ausgabe.append("Programm wird geupdatet. Bitte warten...\n");
                        button1.setEnabled(false);
                        URL url2 = new URL("http://www.marfir.de/schule/update.txt");
                        URLConnection verbindung2 = url2.openConnection();
                        BufferedReader bfr2 = new BufferedReader(new InputStreamReader(verbindung2.getInputStream()));
                        while ((zeile=bfr2.readLine()) != null)
                        {
                            Object o = ladeKlasse("http://www.marfir.de/schule/", zeile.trim());
                            System.out.println(o.toString());
                        }
                        bfr2.close();
                        //fertig geupdatet
                        ausgabe.append("Das Programm wurde erfolgreich aktualisiert!\n");
                        button1.setEnabled(true);
                    }


Was ich auch nicht verstehe, wieso wird das "ausgabe.append("Das Programm wurde erfolgreich aktualisiert!\n");" nicht angezeigt, aber der Button danach wird noch verändert. Normalerweise sollte das doch angezeigt werden.


Ich bin für jeden Tipp dankbar. Bin etwas verwirrt. ;-)
 
Hä? Also zeigen sich nach der update deines Programmes jetzt Veränderungen oder nicht? Oder erst nach Neustart?

mfg
jagdfalke
 
Keine Veränderungen! Wenn welche da wären, würd ich hier nicht posten müssen :wink:

"Oder erst nach Neustart?"

Wie meinst du das? Wenn ich mein Programm starte, update, beende, und wieder starte dann hab ich natürlich das alte Programm offen. Der lädt ja nicht die .class runter und ersetzt die lokalen, sondern erzeugt ne neue Instanz. Oder seh ich das falsch? ???:L
 
Um das nochmal zu verdeutlichen:

Die Ausgabe auf der Console ist, wenn ich auf ja (updaten starten) klicke:

http://www.marfir.de/schule/, chatclient
ladeKlasse(): laden erfolgreich!
chatclient[frame0,256,201,512x366,invalid,hidden,layout=java.awt.BorderLayout,title=Chatclient 1.1...]
(wenn es funktioniert hätte, müsste im title=Chatclient 1.2 oder 2.0 stehen)

Die Ausgabe im Textarea:

Programm wird geupdatet. Bitte warten...
Das Programm ist erfolgreich aktualisiert wurden!


Ich kann mir nicht erklären, wieso ich hier scheinbar eine Instanz von meinem lokalen Client zurück bekomme, anstatt die neue aus dem Netz. Und dann seh ich noch nicht mal das neue Fenster (also von der lokalen Instanz). Komischerweise ging das schon mal alles...
 
Ich habs grad mal lokal getestet um eventuelle Zugriffsprobleme ect. auszuschließen, leider selbes Problem:


Chatclient gestartet!
file:///E:\Schule\Netzwerkprog\chatclientupdate2\build\classes\, chatclient
isLocalClass? false
ladeKlasse(): laden erfolgreich!
chatclient[frame0,256,201,511x366,invalid,hidden,layout=java.awt.BorderLayout,title=Chatclient 1.1 mit Updatefunktion © by Marfir,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]


Ich bekomm wieder nur eine Instanz vom lokal laufenden Programm zurück.
Warum???
???:L
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben