Dynamische Bibliotheken einbinden

Status
Nicht offen für weitere Antworten.

SuperSeppel13

Bekanntes Mitglied
Hallo Leute,

ich weiß nicht, ob "dynamische Bibliotheken" wirklich das sind, was ich suche, aber mir fiel nichts passenderes ein.
Am besten beschreib ich mein Problem anhand eines kleinen Beispiels:

Ich arbeite gerade an einer Art Download-Manager, der von der Seite X Bilder herunterlädt. Ich schreibe also eine Klasse, die die nötigen Methoden enthält um die gwünschten Inhalte zu beziehen. ...soweit kein Problem.
Nun wird aber die Seite überabreitet und die Inhalte werden anders organisiert, sodass die alten Download-Methoden nicht mehr funktionieren. Ich muss also neue Methoden schreiben und das ganze Programm aktualisieren.

Viel schöner und bequemer wäre es aber, die Klasse mit den Download-Methoden in eine Art externe Bibliothek zu verlagern, die erst zur Laufzeit eingelesen wird und die bei Änderungen schlicht ausgetauscht werden kann.
So könnte ich auch andere Bibliotheken für ander Seiten hinzufügen und dann auswählen, von welcher Seite die Bilder geladen werden sollen - gewissermaßen wie plug-ins für verschiedene Seiten.

Unter Windows ist sowas wenn ich mich nicht irre mit .dlls zu bewerkstelligen, aber wie mach ich sowas in Java? Und wie lese ich die Bibliotheken dann ein?
Google hat mir da nicht viel weitergeholfen, da ich nicht genau weiß, wonach ich suchen muss.

Wär echt klasse, wenn jemand 'ne Idee hätte!
 

Icewind

Bekanntes Mitglied
Du musst mit class loadern arbeiten. Am einfachsten mit dem URLClassLoader...
Von dem erbst du dann deinen eigenen ClassLoader, mit der protected Methode addURL(String) kannst du ein jar archiv bzw einen Ordner zum ClassPath hinzufügen. Dh an diesem Ort bzw in dem jar archiv wird in Zukunft nach Klassen gesucht.

Jetzt kannst du mit der Methode loadClass(String) Klassen aus dem gerade hinzugefügen jar laden, der String ist der komplette Name, also zb: "org.javaforum.plugin.HelloWorld"...
Mit dem daraus gewonnen Class Object kannst du eine neue Instanz von HelloWorld anlegen...
 

musiKk

Top Contributor
Nur ne kleine Anmerkung: Der URLClassLoader ist schon selbst verwendungsfähig. Man muss nicht erst von ihm erben.
 

SuperSeppel13

Bekanntes Mitglied
Danke für die schnellen Antworten - das klingt schonmal vielversprechend!
Werd's so bald wie möglich ausprobieren. Sollte ich auf probleme Stoßen, melde ich mich nochmal.
 

HoaX

Top Contributor
Im Prinzip sollte es auch reichen den betreffenden Code in ein eigenes Jar auszulagern und dieses in den Classpath/Manifest mit aufzunehmen. Dann musst du nur das Jar austauschen von Hand und fertig ...
 

faetzminator

Gesperrter Benutzer
... und die Applikation neu starten. Beim CL musst du nur dem Programm sagen (bzw. das so implementieren), dass die Jar neu geladen werden soll.
 

SuperSeppel13

Bekanntes Mitglied
Also ich hab jetzt mal ausprobiert, ein Beispielklasse mit URLClassLoader zu laden. Das scheint auch gewissermaßen funtkioniert zu haben - zumindest erhalte ich keine Exceptions. Aber ich kann nun keine Instanz der Klasse erzeugen um dann deren Methoden auszuführen.

Mein Beispiel sieht bisher so aus:
Java:
    URL[] urls = {new URL("file://E:/Djen/")};
    Class test = new URLClassLoader(urls).loadClass("Test");
    Object o = test.newInstance();
    System.out.println(o.getClass());
Die geladene Klasse "Test" ist nichts weiter als
Java:
public class Test{
    public String test(){
        return "test";
    }
}
Wenn ich das ausführe, wird in der Konsole richtigerweise "class Test" ausgegeben.
Ergänze ich aber die Zeile
Java:
Method m = test.getMethod("test");
führt das zu einer NoSuchMethodException.
Warum? Es gibt die "test"-Methode doch! Was mach ich da falsch?
 
Zuletzt bearbeitet:

musiKk

Top Contributor
Sollte eigentlich gehen. Aber warum castest Du die Instanz ([c]o[/c]) nicht einfach nach [c]Test[/c] und führst die Methode direkt aus?
 

SuperSeppel13

Bekanntes Mitglied
Naja, einfach nach "Test" casten kann ich nicht, da "Test" als Klassenname ja nicht bekann ist.
Java:
Test t = (Test)o;
funktioniert also nicht.
Wenn ich aber beispielsweise die Klasse Test von JButton erben lasse, kann ich die Instanz der geladenen Klasse auch nicht nach JButton casten --> ClassCastException

Auch
Java:
JButton.class.isAssignableFrom(test)
liefert nicht true, selbst wenn Test eine Unterklasse von JButton ist.
 

Icewind

Bekanntes Mitglied
Bei meinen Systemen hat es sich bewährt alle Klassen die so eingebunden werden von einem gewissen Interface erben zu lassen...
Somit kannst du zumindest auf dieses Interface casten...
 

SuperSeppel13

Bekanntes Mitglied
Das war meine Idee, abe ich kann überhaupt nicht casten. Ich bekomm immer ne ClassCastException, ganz egal was ich hab und zu ws ich's casten will. Hab scho einiges ausprobiert, aber nichts geht...
 

musiKk

Top Contributor
Könnte es ein Problem sein, dass sich die Klasse Test offensichtlich im default Package befindet?

Ansonsten wäre vielleicht ein kleines komplettes Beispiel nicht schlecht.
 

SuperSeppel13

Bekanntes Mitglied
Naja, die Klasse Test befindet sich in überhaupt keinem Package. Ich dachte, die Idee sei, dass ich irgendeine Klasse von völlig egal wo laden und ausführen kann. Aber es scheint auch völlig egal zu sein, welchem Package ich die Klasse zuordne und von wo ich sie lade - ausführen kann ich sie einfach nicht!

Langsam weiß ich echt nicht mehr weiter... hat nicht vielleicht irgendwer ein funktionierendes Beispiel, das ich mir mal ansehen könnte? Wär echt klasse!!!
 

faetzminator

Gesperrter Benutzer
Sie darf nicht in einem Package sein, in welchem sich deine "eigentlich App" befindet. Mach ein Subpackage, in welchem sich der Rest nicht befindet. (z.B. ch.faetzminator.<project>.core.* und ch.faetzminator.<project>.modules.*)
 

Wildcard

Top Contributor
Sie darf nicht in einem Package sein, in welchem sich deine "eigentlich App" befindet. Mach ein Subpackage, in welchem sich der Rest nicht befindet. (z.B. ch.faetzminator.<project>.core.* und ch.faetzminator.<project>.modules.*)

Wie kommst du darauf? Im gleichen Package ist kein Problem, solange sich keine Klassennamen überschneiden.
 

musiKk

Top Contributor
Naja, die Klasse Test befindet sich in überhaupt keinem Package.

Ungeachtet der anderen Aussagen: Ist eine Klasse in "keinem" Package, ist sie im default Package. Sagt man einfach so. Es wird allgemein nicht empfohlen, Klassen im default Package zu lassen.

Anyway... auch wenn ich das selten mache, hier mal ein Beispiel.

Das Hauptprogramm:
Java:
package test;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class JavaForumTest {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {

		URLClassLoader urlCl = new URLClassLoader(new URL[] { new File(args[0])
				.toURI().toURL() });
		Class<MyInterface> myClass = (Class<MyInterface>) urlCl
				.loadClass("test.MyImpl");

		MyInterface my = myClass.newInstance();
		my.sayHello();

	}

}

interface MyInterface {
	void sayHello();
}
Und hier die Klasse, die in ein Jar soll, welches das erste Argument des Hauptprogramms ist:
Java:
package test;

public class MyImpl implements MyInterface {

	@Override
	public void sayHello() {
		System.out.println(this + " says hello!");
	}

}
 

SuperSeppel13

Bekanntes Mitglied
OK, hab's hinbekommen. Muss mich außerdem bei euch entschuldigen:
Ich hab mir igenwann mal ein Test-Projekt angelegt, dass ich immer benutze, wenn ich etwas ausprobieren will ohne damit meine "richtigen" Projekte zu belasten....
naja, kurz:
Es gab schon eine Klasse Test im gleichen Ordner wie die Klasse, mit der ich meine neue Test-Klasse auslesen wollte und da der ClassLoader ja immer erst alle möglichen verzeichnisse durchsucht, bevor er in dem nachschauht, das ich bei der Initialisierung übergebe, hat er immer diese alte Test-Klasse geladen, die natürlich nicht das tat, was ich mir wünschte.

Habe diese nun entfernt! Jetzt geht's also.
Tut mir echt leid, wegen sowas eure Zeit in Anspruch genommen zu haben.

Auf jeden Fall vielen Dank für die ganze Hilfe! Ich denke, den Rest schaffe ich allein.
Obwohl, eine Frage hätt ich noch:
Da der ClassLoader ja immer alle möglichen Verzeichnisse durchsucht, dauert es ziemlich lange, bis er die richtige Klasse gefunden hat. Kann man dem irgendwie sagen, dass er zuerst im angegebenen Verzeichnis suchen soll?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
hello_autumn Statistische/dynamische Tests Allgemeine Java-Themen 10
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
J Dynamische Rückgabewerte Allgemeine Java-Themen 2
K Dynamische Webseiten auslesen Allgemeine Java-Themen 6
S Variablen Dynamische Arrays Allgemeine Java-Themen 2
N Dynamische Objekte / DB Allgemeine Java-Themen 5
B dynamische Java Slideshow Allgemeine Java-Themen 4
B Script Problem "Dynamische Datenstruktur" Allgemeine Java-Themen 13
A Dynamische PDF Erstellung mit iText Allgemeine Java-Themen 4
ModellbahnerTT Dynamische Programmierung, komme nicht weiter.... Allgemeine Java-Themen 15
C dynamische imports? Allgemeine Java-Themen 13
hdi dynamische return-Werte Allgemeine Java-Themen 15
M JUnit und dynamische Tests Allgemeine Java-Themen 11
X dynamische bindung - Typsystem :?: Allgemeine Java-Themen 5
C dynamische variablen Namen! Allgemeine Java-Themen 4
D dynamische Objekte erzeugen? Allgemeine Java-Themen 16
G eigener logger mittels classe (dynamische logfilename) log4j Allgemeine Java-Themen 15
R Dynamische Sorten-Prüfung? Allgemeine Java-Themen 8
F dynamische ArrayListen? Allgemeine Java-Themen 8
C kann man dynamische variablen namen vergeben? Allgemeine Java-Themen 2
H "dynamische Ladegrafik" Allgemeine Java-Themen 2
C Dynamische Varibalen Allgemeine Java-Themen 3
C dynamische Vererbung Allgemeine Java-Themen 6
D Was sind Bibliotheken in Java/Pyhton? Allgemeine Java-Themen 1
C Bibliotheken für Algorithmische Geometrie Allgemeine Java-Themen 2
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
B Fat Jar mit externen Bibliotheken Allgemeine Java-Themen 20
D JNI->kann abhängige Bibliotheken einer DLL nicht finden Allgemeine Java-Themen 4
I bibliotheken nur via kommandozeile laden Allgemeine Java-Themen 16
G Webstart Java Web Start und native Bibliotheken Allgemeine Java-Themen 3
F Laden von externen Bibliotheken Allgemeine Java-Themen 3
D Darf ich jakarta bibliotheken ohne weiteres nutzen? Allgemeine Java-Themen 10
KrokoDiehl thread-unsichere, native Bibliotheken Allgemeine Java-Themen 11
H importierte Bibliotheken in Applet? Allgemeine Java-Themen 4
L Bibliotheken um Videos abzuspielen Allgemeine Java-Themen 4
D Ahängige Bibliotheken (JARs) ermitteln Allgemeine Java-Themen 6
G Hardwarenahe Bibliotheken für Java? Allgemeine Java-Themen 2
K Applet dass auf mehrere Bibliotheken zugreift Allgemeine Java-Themen 13
R Dynamisches Laden von JNI-Bibliotheken Allgemeine Java-Themen 4
Q Bibliotheken mit ins eigene Jar aufnehmen Allgemeine Java-Themen 4
M Bibliotheken löschen <Problem> Allgemeine Java-Themen 12
J Bibliotheken erst zur Laufzeit laden Allgemeine Java-Themen 5
G Laden von Bibliotheken Allgemeine Java-Themen 4
M günstigen Weg zum Auffinden nicht benötigter Bibliotheken Allgemeine Java-Themen 8
X JasperReports Bibliotheken Einbinden Allgemeine Java-Themen 2
G Latex/Tex Bibliotheken für Java? Allgemeine Java-Themen 5
G Installation diverser Bibliotheken in Eclipse. Allgemeine Java-Themen 3
U Einbinden libphonenumber Allgemeine Java-Themen 3
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
E Zahlungsmöglichkeiten im Web-App einbinden Allgemeine Java-Themen 4
T StdCall DLL in Java einbinden Allgemeine Java-Themen 13
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
S Eclipse TestNG: Textfeld einbinden? Allgemeine Java-Themen 1
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
T iText mit eclipse richtig in Java-Projekt einbinden Allgemeine Java-Themen 2
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
MaxG. Bilddateien richtig einbinden Allgemeine Java-Themen 9
J Historische Börsendaten einbinden Allgemeine Java-Themen 14
H API einbinden Allgemeine Java-Themen 5
A Applet in HTML einbinden Allgemeine Java-Themen 1
N Eclipse Projekt von GitHub in bestehendes Projekt einbinden Allgemeine Java-Themen 13
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
S Eclipse Annotation Processor in Eclipse einbinden Allgemeine Java-Themen 0
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
D VBScript in .jar einbinden und aufrufen Allgemeine Java-Themen 5
M Datenbankdatei in Java einbinden Allgemeine Java-Themen 16
T C DLL einbinden und Pointer übergeben Allgemeine Java-Themen 13
C images einbinden Allgemeine Java-Themen 7
T Dll erstellen und einbinden Allgemeine Java-Themen 1
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
X 3d Modelle einbinden Allgemeine Java-Themen 1
Developer_X OpenStreetMap in Java Programm einbinden Allgemeine Java-Themen 10
M Eclipse libgcrypt für window in java Projekt einbinden Allgemeine Java-Themen 1
K Website in Programm einbinden und auslesen Allgemeine Java-Themen 2
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
P Sprache ändern ins Programm einbinden Allgemeine Java-Themen 6
L Classpath Klasse einbinden Allgemeine Java-Themen 8
A NodeJs/Javascript txt.Datei einbinden Allgemeine Java-Themen 2
M Barcode und Bilder in PCL einbinden Allgemeine Java-Themen 0
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
J rxtxserial.dll für 32 oder 64bit dynamisch einbinden Allgemeine Java-Themen 9
M Javaprogrammierung in Webapp einbinden Allgemeine Java-Themen 7
U Eclipse Java Projekt - Webservice einbinden Allgemeine Java-Themen 7
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
J excel einbinden Allgemeine Java-Themen 2
S Android: SQLite Framework einbinden Allgemeine Java-Themen 2
G JNotfiy-DLL einbinden Allgemeine Java-Themen 4
R Batch / Shell-Skript in Jar.Datei einbinden? Allgemeine Java-Themen 5
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
E Assembler einbinden Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben