OOP Externe Klasse erweitern (ohne Vererbung!!)

chackie-lee

Mitglied
Hallo zusammen,

ich bin neu im Forum und komme aus der Ecke C/C++ und Python.
Daher entschuldigt bitte, falls mein Java-Wording noch nicht perfekt ist.

Bei meinen Problem geht es um folgendes Szenario:
Ich muss ein paar Klassen eines Java-Programmes erweitern, so dass dieses Programm als externe Library in ein neues Projekt eingebunden werden kann.
Dabei darf ich das Programm im Quellcode nicht anfassen sondern es nur als JAR in mein neues Projekt einbinden.
Ich möchte im neuen Projekt dieselbe Package-Struktur und denselben Klassen-Namen der Original-Klassen verwenden. Dadurch können Kollegen, die das alte Programm kennen, wie gewohnt ihre Klassen anlegen und nun auch auf die neuen Funktionen zurückgreifen.

Im Prinzip stelle ich mir folgendes vor (Pseudo-Code):
Altes Programm mit zu erweiternder Klasse (wird als Jar eingebunden):
Java:
package com.company.testen;
public class test
{
  public String auto() ...
  public String fahrrad() ...
}
Neues Projekt/Library:
Java:
package com.company.testen;
public class test extends test
{
  public String schiff() ...
  public String rakete() ...
}
Projekt der Kollegen:
Java:
import com.company.testen;
public class Main {
  public static void main() {

    test pruefen = new test();

    pruefen.auto()
    pruefen.fahrrad()
    pruefen.schiff()
    pruefen.rakete()
  }
}

So wie ich es beschrieben habe, kann man es leider nicht programmieren.

Wie gesagt, den Quellcode des jar-Files darf ich leider nicht anfassen.

Folgende Ideen sind mir bis jetzt gekommen:
- Klasse mit Vererbung und neuen Funktionen erstellen. Alte Klassen entladen und neue Klassen an deren stelle laden (Selber Speicherbereich).
- Irgendeine Java-Funktion, die umgekehrte Vererbung ermöglicht. Ich zwinge der Eltern-Klasse quasi meine neuen Funktionen auf (es wird keine neue Klasse erstellt).

Mir ist klar, dass das ganze wahrscheinlich nicht sehr "sauber" ist.

Hat jemand eine Idee?

Dank im Vorraus,
chackie-lee
 

nroz

Mitglied
Verstehe ich das richtig.

Du hast Projekt A (altes Modul) und nun arbeitest du an Projekt B (deine Sourcen + altes Modul) die sich nach aussen
geben sollen wie das Projekt A nur das du in Projekt A nichts ändern darfst?

Wenn dem so ist würde ich dir das Adapter Pattern vorschlagen.


Java:
public class MyAdapter 
{
	private OldClass tehOldey = new OldClass();
	
	public String schiff()
	{
		return tehOldey.schiff();
	}
	
	public String rakete()
	{
		return tehOldey.rakete();
	}
	
	public String auto()
	{
		// neue Funktion
		return "möp";
	}
	
	public String fahrrad()
	{
		return "tröt";
	}
}
 

slawaweis

Bekanntes Mitglied
Wie gesagt, den Quellcode des jar-Files darf ich leider nicht anfassen.
LGPL?

Folgende Ideen sind mir bis jetzt gekommen:
- Klasse mit Vererbung und neuen Funktionen erstellen. Alte Klassen entladen und neue Klassen an deren stelle laden (Selber Speicherbereich).
das wäre eine Möglichkeit, mit verschiedenen Classloadern. Falls aber das alte API neue Funktionen bekommt, braucht man die neuen Signaturen für das Kompilieren und da könnte es Probleme mit gleichen Packages geben.

- Irgendeine Java-Funktion, die umgekehrte Vererbung ermöglicht. Ich zwinge der Eltern-Klasse quasi meine neuen Funktionen auf (es wird keine neue Klasse erstellt).
Java bietet so was nicht an. Die einzige Möglichkeit das zu machen wäre, den Binärcode einer Klasse zu laden, zu verändern und daraus im Speicher eine neue Klasse zu erstellen. Aber das wäre schon Reverse Engineering in Echtzeit.

Der einfachste und sicherste Weg wäre, sich einen neuen Namensraum zu definieren, z.B. "xyz.com.company.testen" und darin das gesamte API von "com.company.testen" über Vererbung oder Delegation nachzubilden, so wie man es haben möchte:

Java:
package xyz.com.company.testen;

public class Test extends com.company.testen.Test
{
  public String schiff() ...
  public String rakete() ...
}

Dann muss man nur noch in allen Java-Klassen, welche das alte API verwenden, die Package-Namen austauschen: "com.company.testen" -> "xyz.com.company.testen". Wenn man das gesamte API nachgebildet hat, sollte es keine Probleme geben. Mit einem Ant-Script könnte man es sogar automatisieren und zwischen der alten und neuen Version hin und her schalten.

Slawa
 

chackie-lee

Mitglied
Schon ein mal Danke für die schnellen Antworten zum Problem.

Die vorgestellten Lösungen beinhalten leider, dass es eine neue Klasse mit den alten Funktionen gibt oder dass eine neue Package-Struktur mit demselben Klassen-Namen erstellt wird.
In beiden Fällen muss der Kollege seinen Code zum Einbinden der neuen Funktionen (inkl. den alten) also anpassen.

Genau das möchte ich ja gerne verhindern.

Grundsätzlich: Sehr schlechte Idee. Zumal es sowieso nicht funktioniert, wenn Du das alte Package mit einbindest.

Soweit ich weiß, kann ich doch ein eingebundenes Package mit neuen Klassen erweitern, in dem ich im Projekt genau dieselbe Package-Struktur verwende. Oder ist das doch nicht möglich?

Falls es nicht möglich ist, dann kann ich wirklich nur auf eine der vorgestellten Lösungen von nroz oder slawaweis zurückgreifen.
 

Michael...

Top Contributor
Soweit ich weiß, kann ich doch ein eingebundenes Package mit neuen Klassen erweitern, in dem ich im Projekt genau dieselbe Package-Struktur verwende.
Mit neuen Klassen ist das durchaus möglich - aber unschön. Aber wenn ich das richtig verstanden habe, willst Du ja auch Klassen mit dem selben/bereits vergebenen Namen erstellen - und zusätzlich noch von den alten erben?
 

chackie-lee

Mitglied
Hallo Michael,

richtig, genau das ist mein Anliegen. Schön auf den Punkt gebracht.
Aber ich höre aus deinen Posting raus, dass das wohl nicht möglich ist.
 

nroz

Mitglied
Schon ein mal Danke für die schnellen Antworten zum Problem.

Die vorgestellten Lösungen beinhalten leider, dass es eine neue Klasse mit den alten Funktionen gibt oder dass eine neue Package-Struktur mit demselben Klassen-Namen erstellt wird.
In beiden Fällen muss der Kollege seinen Code zum Einbinden der neuen Funktionen (inkl. den alten) also anpassen.

Genau das möchte ich ja gerne verhindern.



Soweit ich weiß, kann ich doch ein eingebundenes Package mit neuen Klassen erweitern, in dem ich im Projekt genau dieselbe Package-Struktur verwende. Oder ist das doch nicht möglich?

Falls es nicht möglich ist, dann kann ich wirklich nur auf eine der vorgestellten Lösungen von nroz oder slawaweis zurückgreifen.

Wenn vernünftig gegen Interfaces implementiert wurde ist so eine Änderung normalerweise kein großer Aufwand. ;-)
 

slawaweis

Bekanntes Mitglied
Die vorgestellten Lösungen beinhalten leider, dass es eine neue Klasse mit den alten Funktionen gibt oder dass eine neue Package-Struktur mit demselben Klassen-Namen erstellt wird.
In beiden Fällen muss der Kollege seinen Code zum Einbinden der neuen Funktionen (inkl. den alten) also anpassen.

Genau das möchte ich ja gerne verhindern.
inzwischen habe ich das Gefühl, dass es darum geht die Bibliotheken heimlich auszutauchen, ohne dass es die Kollegen überhaupt merken. Sorry, aber zum Leben der Softwareentwickler und Programmierer gehört es, dass die Werkzeuge und Bibliotheken sich mit der Zeit weiterentwickeln. Man kann doch nicht sagen: "wir arbeiten nur mit dem alten API von Heute bis zu unserer Rente und rühren keinen Finger, um es zu modernisieren". Wenn man einmal an dem Punkt angekommen ist wo dieser Thread begann, dass man bestehende Klassen zu Laufzeit dynamisch erweitern will, dann stimmt irgendwas mit dem Design der Software nicht mehr. Entweder man passt sich dem Fortschritt an und weist die Kollegen an eine neue Bibliothek zu lernen und zu nutzen, oder man beginnt die nächste Generation der Software zu entwickeln, wo man gleich ein neues modernes Design festlegt, um die alten Probleme über Bord zu werfen. Man könnte das ganze sogar auf einer anderen Programmiersprache aufbauen, wenn Java nicht mehr ausreicht.

Noch mal zu meinem Vorschlag. Wenn man das API mit einem anderen Namespace nachbildet, muss man nichts mehr machen, als die Namespacenamen in den Quelltextdateien auszutauchen. Das kann man ganz leicht automatisieren, so dass die Kollegen nichts machen müssen, außer vielleicht davon zu erfahren. Man könnte z.B. den ganzen Quelltext in der Versionsverwaltung anpassen oder auf jedem Computer einzeln, über ein Script.

Slawa
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hijo2006 Neue externe Klasse einbinden Java Basics - Anfänger-Themen 13
S Klassen Externe Klasse in ein Projekt mit einbinden Java Basics - Anfänger-Themen 7
D Externe Comperator-Klasse Java Basics - Anfänger-Themen 3
S komponente über externe klasse zufügen Java Basics - Anfänger-Themen 13
T Sichtbarkeiten und externe Klasse Java Basics - Anfänger-Themen 33
J Zugriff von main-Klasse auf externe Klassen Java Basics - Anfänger-Themen 51
X Extrahieren in Externe Klasse Funktioniert nicht Java Basics - Anfänger-Themen 6
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
B Pfad für eine externe Klasse Java Basics - Anfänger-Themen 4
M Externe Klasse einbinden Java Basics - Anfänger-Themen 5
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
C externe jar einbinden in Eclipse-Projekt Java Basics - Anfänger-Themen 2
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
S Maven und externe Library Java Basics - Anfänger-Themen 2
tom.j85 Externe Rest API konsumieren Java Basics - Anfänger-Themen 9
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
W Externe class in Eclipse importieren Java Basics - Anfänger-Themen 0
G Servlet - externe HTML (URL) auslesen Java Basics - Anfänger-Themen 1
T Externe Methoden aufrufen Java Basics - Anfänger-Themen 3
M Externe .jar in Sublime einbinden Java Basics - Anfänger-Themen 5
E Externe Library .zip Datei importieren Java Basics - Anfänger-Themen 3
D Externe Eeite beim Mousover anzeigen Java Basics - Anfänger-Themen 0
U Externe Library im non runnable jar File im eclipse Java Basics - Anfänger-Themen 1
S externe Datei erstellen, oeffnen, bearbeiten Java Basics - Anfänger-Themen 2
D Externe Libs in Jar Java Basics - Anfänger-Themen 2
S externe Webseiten füllen Java Basics - Anfänger-Themen 5
H Classpath java.lang.NoClassDefFoundError externe Libary Java Basics - Anfänger-Themen 4
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
N Jar-File soll externe class-Datei benutzen Java Basics - Anfänger-Themen 8
S Externe Bibliothek zu Resources hinzufügen? Java Basics - Anfänger-Themen 5
B Externe Libraries fuer Applet ... Pfad eingeben? Java Basics - Anfänger-Themen 23
V Input/Output Plattform unabhängig auf externe Dateien zugreifen Java Basics - Anfänger-Themen 4
P Threads Thread und Zugriff auf externe Methode beenden Java Basics - Anfänger-Themen 4
N Klassen externe .class einbinden Java Basics - Anfänger-Themen 9
F Input/Output Wie externe Datei NICHT mit dem Standardprogramm öffnen? Java Basics - Anfänger-Themen 3
T externe Datei fest an Projekt binden Java Basics - Anfänger-Themen 2
K Klassen externe JAR in Programm einbinden Java Basics - Anfänger-Themen 5
E externe .txt Datei mit Scanner einlesen Java Basics - Anfänger-Themen 7
Steve5000 Externe Batch-Datei starten und anwendung beenden?! Java Basics - Anfänger-Themen 4
L Externe Dateien, wohin? Java Basics - Anfänger-Themen 7
T externe Programme pipen Java Basics - Anfänger-Themen 2
P Externe IP ermitteln? Java Basics - Anfänger-Themen 5
-horn- Externe Lib: JavaSCI richtig einbinden? Java Basics - Anfänger-Themen 5
I externe JAVA-Schnittstelle einbinden Java Basics - Anfänger-Themen 2
A Externe Klassen Laden und ausführen Java Basics - Anfänger-Themen 12
P externe JARs integrieren Java Basics - Anfänger-Themen 9
Y Applet lokal executable machen, externe Files inkludieren Java Basics - Anfänger-Themen 8
C externe Klassen in Projekt einbinden Java Basics - Anfänger-Themen 10
I Listenerklassen in externe Dateien auslagern? Java Basics - Anfänger-Themen 7
G Intern auf externe IP zugreifen? Java Basics - Anfänger-Themen 7
S externe Klassen Java Basics - Anfänger-Themen 3
M Parameterübergabe an externe JAR-Datei? Java Basics - Anfänger-Themen 2
Schandro Externe Bibliothek OHNE IDE benutzen Java Basics - Anfänger-Themen 5
B Externe .exe-Dateien starten +Runtime Java Basics - Anfänger-Themen 6
W Kann in meiner Jar nicht auf externe Jar zugreifen Java Basics - Anfänger-Themen 4
G zugriff auf festplatte / externe festplatten Java Basics - Anfänger-Themen 12
T Externe Datei aufrufen Java Basics - Anfänger-Themen 6
T Externe JAR datei in eigene? Java Basics - Anfänger-Themen 2
S externe Datei unformatiert einlesen & in double konverti Java Basics - Anfänger-Themen 2
B Paint(Component) und externe Objekte Java Basics - Anfänger-Themen 6
S per Kommandozeile compilieren: Problem: externe Jars einbind Java Basics - Anfänger-Themen 16
D Externe .jar in Eclipse nutzen Java Basics - Anfänger-Themen 3
F Externe Batch Datei aufrufen Java Basics - Anfänger-Themen 5
G Auf externe Resourceb zugreifen Java Basics - Anfänger-Themen 6
S externe URL öffnen und in Variable speichern. Java Basics - Anfänger-Themen 9
L Externe *.jar verwenden (ohne IDE) Java Basics - Anfänger-Themen 9
G JAR: Externe Dateien zur Laufzeit aufrufen Java Basics - Anfänger-Themen 12
I Wie eine externe Funktion rufen? Java Basics - Anfänger-Themen 11
G Externe Klassen mit ausliefern Java Basics - Anfänger-Themen 4
J Anfängerfrage: wie externe Dateien importieren? Java Basics - Anfänger-Themen 5
F Externe Datei aufrufen Java Basics - Anfänger-Themen 3
V Auf externe MySQL DB connecten? Java Basics - Anfänger-Themen 6
D Projekt als jar exportieren: Wie externe jars einbauen? Java Basics - Anfänger-Themen 5
A externe Library wird nicht gefunden Java Basics - Anfänger-Themen 4
K externe jar einbinden Java Basics - Anfänger-Themen 2
T Externe Api einbinden Java Basics - Anfänger-Themen 4
F externe programme ueber eine string starten Java Basics - Anfänger-Themen 2
J String in externe Datei speichern Java Basics - Anfänger-Themen 2
N wie externe bibliotheken einbinden? Java Basics - Anfänger-Themen 2
S externe lib´s in welchen ordner packen? Java Basics - Anfänger-Themen 6
H Zugriff auf externe Variable Java Basics - Anfänger-Themen 10
G Externe Klassen einbinden Java Basics - Anfänger-Themen 4
S Befehle an externe Programme Java Basics - Anfänger-Themen 4
P Externe Klassen Problem - Eclipse Java Basics - Anfänger-Themen 4
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben