Klasse zur Laufzeit ersetzen

Status
Nicht offen für weitere Antworten.

mikachu

Top Contributor
Hi Community,

kann mir jemand eine detaillierte Anweisung geben, wie ich eine Klasse zur Laufzeit mit einer anderen Klasse ersetzen kann?

Ich muss nen Test bauen, der aber in einer bestimmten Klasse andere Funktionalität beinhalten muss, wie die bereits geladene.

FYI: es wird der System-Classloader genutzt.

MfG mikachu
 
M

maki

Gast
Hi Community,

kann mir jemand eine detaillierte Anweisung geben, wie ich eine Klasse zur Laufzeit mit einer anderen Klasse ersetzen kann?
Klasse oder Objekt?

Am einfachsten wäre wohl den Setter zu nutzen und eine andere Instanz zu übergeben (Fake, Stub, Mock, etc. pp.).

Wenn du uns den Code zeigen würdest könnte man wohl konkretere Tipps geben ;)
 

faetzminator

Gesperrter Benutzer
Mit dem System CL funktionierts nicht. Du musst mit einem URLClassLoader die Klassen laden. Zusätzlich musst du schauen, dass die Klassen auf keinen Fall im Classpath (des Sys CL / der VM) sind.
 

Shulyn

Bekanntes Mitglied
Klasse oder Objekt?

Am einfachsten wäre wohl den Setter zu nutzen und eine andere Instanz zu übergeben (Fake, Stub, Mock, etc. pp.).

Wie wäre es wenn du dir 1 Klasse schreibst (init class) , in der du alle die du benutzt Initialisierst, und dann setter methoden einbaust. so kannst du einfach diese austauschen. Wenn du immer über die init auf sie zugreifst.

bzw es würde schon reichen wenn nur die auszutauschende class in dieser ist.
Ich tausche so z.B einen ExceptionHandler in der Laufzeit aus um alle Exception die in einer bestimmten zeit auftreten gesondert zu behandeln...

Java:
Public class init {

private Exceptionhandler handler = null;

public init() {
this.handler = new Exceptionhandler;
}

public void setExceptionHandler (ExceptionHandler handler);
this.handler = handler;

}

Ich weiß nicht ob dir das so reichen würde... ist aber der einfachste weg der mit so auf anhieb bei mehr als 30grad einfällt.
 

faetzminator

Gesperrter Benutzer
Hab jetzt ich oder ihr was falsch verstanden? Wegen dem Sys CL Hint denke ich es geht um dynamisches Nachladen von Klassen (bzw. will er (logischerweise) eine Instanz davon haben).
 
S

Spacerat

Gast
Kommt drauf an, welche Klassen du wann ändern willst. Sollen es nur Klassen ausserhalb "rt.jar" sein, kannst du einem eigenen ClassLoader den SystemClassLoader als Parent übergeben. Ansonsten musst du von der System-Property "java.system.class.loader" Gebrauch machen und so einen eigenen ClassLoader zum SystemClassLoader machen. In diesem solltest du allerdings eine Instanz des Originalen bereithalten, damit Systempakete (mit allen Sicherheitsmechanismen usw.) überhaupt noch geladen werden können.
 

mikachu

Top Contributor
Danke für die vielen Antworten bisher.

Die Klasse, die ich zur Laufzeit ersetzen will, ist eine innere, statische Klasse einer anderen.
Mit Objekten komme ich nicht weiter, weil beim Start der Applikation noch keine bereitstehen. Deswegen dachte ich mir, dass da einfach beim Start eine andere Klasse anstelle der zu ersetzenden Klasse geladen werden könnte...

Die Klasse ist in einem separaten JAR abgelegt und ist IMHO nicht im Systemclasspath.

MfG

Edit 1: Ich habe mich noch nie mit dem ClassLoader-Konzept befasst...
Edit 2: ...sollte aber nicht allzu schwer zu erlernen sein :)
 
Zuletzt bearbeitet:

mikachu

Top Contributor
Hi,

habs irgendwie gelöst gekriegt ;-).

"Einfach" einen neuen Classloader erstellen, der von URLClassloader ableitet und welcher den System.classloader als parent erhält.

Dann noch loadClass() überschreiben und gut.
So klappts zumindest erstmal.

Danke an alle Beteiligten,
mikachu
 

mikachu

Top Contributor
Hallo nochmal,

es kamen andere Aufgaben dazwischen, sodass ich mich erst heute wieder mit dem Thema befassen konnte...

Das geht doch nicht so einfach, wie ich mir es dachte.

Die zu ersetzende Klasse ist eine innere, statische und als final definierte. Eben wegen final keine Ableitung möglich!

Jetzt hab ich das an einem kleinen Test probiert, und bin gescheitert :'(

Hat da ijemand eine lösungsweisende Idee, wie ich da ran gehen kann?

MfG mikachu
 
S

Spacerat

Gast
...bei "loadClass()" waren wir ja schon...
Nun fehlt nur noch das Abfangen des Dateinamens der Klasse. Bei inneren Klassen ist darauf zu achten, dass der Punkt der in Java gewohnten Notation nicht durch einen Slash, sondern durch eine Dollar-Zeichen ("$") getrennt wird.
Code:
package.OuterClass.InnerClass -> package/OuterClass$InnerClass.class
Ferner bekommen anonyme Klassen keinen Namen, sondern eine Nummer. Dadurch wird gezieltes Ersetzen ein wenig erschwert.
Code:
package.OuterClass.AnonClass1 -> package/OuterClass$1.class
Wurde der Dateiname der zu ersetzenden Klasse erstmal abgefangen, kann die Ersatzdatei von einer anderen Quelle geladen werden und als Byte-Array an "defineClass()" übergeben werden. Innerhalb der Klasse müssen (sollten) der Klassenname, der Paketname und alle von aussen erreichbare Felder und Methoden übereinstimmen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
L Zur Laufzeit eine Klasse laden, die auf jar-File zugreift Allgemeine Java-Themen 15
G genauen Typ einer generischen Klasse zur Laufzeit ermitteln Allgemeine Java-Themen 2
G Klasse wird zur Laufzeit nicht gefunden? Allgemeine Java-Themen 3
M Überprüfen einer zur Laufzeit geladenen Klasse Allgemeine Java-Themen 3
I Zur Laufzeit ermitteln, ob Klasse in JAR-Datei Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben