Methoden verändern

Hallo,

ich benutze eine sehr große API und mein Problem an der Sache ist, dass ich bei der API unbedingt etwas verändern muss. Ich kann keine Vererbungen durchführen, da der Konstruktor private ist.

Das ist aber nicht das große Problem.

Es gibt bei der API eine Methode
(Beispielcode)
Code:
public void run() {
        String s = "";
       
        if ( s.equals( "x" ) ) {
           
        }
    }

Ich will z.B. das x abändern in s.
Wie mache ich das? Ich kann nicht die komplette API decompilen, den Wert ändern und wieder compilen. Vererbung klappt leider nicht.


Zusammengefasst:
1. API: Enthält eine Methode und ich will den Wert verändern
2. Kann keine Vererbungen durchführen
3. Konstruktor kann nicht aufgerufen werden, da es private ist (außerhalb eines Packages).


Wie kann man das Problem lösen?


LG,
 

Joose

Top Contributor
Warum muss dieser Code geändert werden? Wie wird das "x" festgelegt? Steht es fix im Code drinnen oder durch den Konstruktor?
 

Joose

Top Contributor
Gut und warum musst du den Code anpassen? Grundsätzlich wird es schon seine Gründe haben warum dieser Wert nicht änderbar ist.
 

Baldur

Aktives Mitglied
Also du willst eine Funktion abändern, kannst aber nicht die Klasse überladen, da der Konstruktor privat ist (alle?).
Die Eingabedaten zu ändern ist auch keine Option? Also sowas wie falsche Werte zu übergeben, die dann aber die Aktion auslösen, die du beabsichtigst? Oder das entsprechende Objekt mit anderen Parametern erzeugen?

Einen Link auf deine API kannst du nicht zufällig bereitstellen?
Ist es denn möglich, den entsprechenden Teil einfach selbst neu zu implementieren oder ist der Aufwand zu groß?

Was genau meinst du mit
Konstruktor kann nicht aufgerufen werden, da es private ist (außerhalb eines Packages).
Ist der Konstruktor private oder package-private? Auf package-private Member kann man glaube ich innerhalb des selben Packages zugreifen. Also könntest du theoretisch eine Klasse in dem Paket deiner API erstellen und dort die gewünschte Klasse überladen. Ist leider Theorie, ich hab keine Ahnung ob sowas wirklich funktioniert :)
 

thecain

Top Contributor
Du könntest mit Reflection die Variable ändern. Die Seiteneffekte sind aber nicht vorherzusagen. Der Konstruktor wird nicht einfach so private sein.

Wenn die API Open Source ist, kannst du vll deine eigene Version forken.
 
Danke für eure Antworten.
@Baldur Nein, man kann leider die Klassen nicht übernehmen, denn die Klasse, die ich verändern will, erbt bereits eine andere Klasse in dem selben Package und die Klassen verwenden Funktionen, die außerhalb nicht stattfindet.

Die Fehlermeldung die ich bekomme (IntelliJ), wenn ich die Klasse erben will:
Code:
'org.api.handle.ThreadLookup' is not public in 'org.api.handle'. Cannot be accessed from outside package

Wenn ich den Konstruktor erstellen will:
Code:
'ThreadLookup(org.api.handle.ThreadLookup.Checker, java.lang.String)' is not public in 'org.api.handle.ThreadLookup'. Cannot be accessed from outside package
Ich darf die API leider nicht zur Verfügung stellen, es tut mir Leid.

Die Eingabedaten zu ändern ist auch keine Option? Also sowas wie falsche Werte zu übergeben, die dann aber die Aktion auslösen, die du beabsichtigst? Oder das entsprechende Objekt mit anderen Parametern erzeugen?
Die Methode heißt "public void run {}", dort ist eine lokale Variable (z.B. String s = "") und wird nicht
vom Parameter beeinflusst, da steht nur ein Eintrag.

Der Konstruktor der Klasse ist nicht private, also da steht nicht "private", sondern
Code:
ThreadLookup( Checker checker, String s ) {

}

Ich wusste nicht, dass man packages private machen kann, ich weiß nicht, ob das nun private ist oder nicht.



Du könntest mit Reflection die Variable ändern. Die Seiteneffekte sind aber nicht vorherzusagen. Der Konstruktor wird nicht einfach so private sein.

Wenn die API Open Source ist, kannst du vll deine eigene Version forken.
Ich habe es schon mit Reflections probiert, jedoch ohne Erfolg. Also ich habe nur versucht, den Konstruktor zu bekommen. Die API ist nicht open-source. Die Fehlermeldungen stehen oben.


LG,
 

InfectedBytes

Top Contributor
package private heißt, dass es nur innerhalb des gleichen package sichtbar ist. Wenn kein sichtbarkeitsmodifizierer vorhanden ist, so ist es package private.
In deinem Fall kannst du also einfach deine neue Klasse in das gleiche package stecken und fertig.
Ansonsten wird die Klasse bestimmt auch einen weiteren Konstruktor haben der öffentlich ist.
 

DrZoidberg

Top Contributor
Reflections ist keine sehr saubere Lösung und kann leicht zu schwer zu findenden Fehlern führen. Aber du könntest anstelle von Vererbung auch soetwas machen:
Java:
class A {
  void x() {
  }
 
  void y() {
  }
 
  void run() {
    String s = "";
   
    if ( s.equals( "x" ) ) {
      
    }
  }
}

class B {
  private A a = new A();
 
  void x() {
    a.x();
  }
 
  void y() {
    a.y();
  }
 
  void run() {
    String s = "";
   
    if ( s.equals( "s" ) ) {
      
    }
  }
}
 
In deinem Fall kannst du also einfach deine neue Klasse in das gleiche package stecken und fertig.
Die API ist in einer externen Jar Datei, nicht in meinem Projekt. Das geht leider nicht.
Die API ist viel zu groß um es zu decompilen, danach zu compilen, außerdem benutzt die API praktisch noch eine API, das ist eben am Ende viel zu kompliziert.


private A a = new A();
Das klappt eben nicht.
Man kann weder einen Konstruktor haben, noch die Klasse erben.
 
Das ist vollkommen egal. Du kannst einfach folgendes tun:
Java:
package org.api.handle;
public class MyClass extends ThreadLookup {

}

packages sind komplett unabhängig von irgendwelchen jars
Okay, danke. Ich probiere es ganz kurz aus.

//EDIT:
@InfectedBytes Bis jetzt klappt gibt es beim Compiler keine Fehler, aber habe dennoch eine Frage: Wird denn die Klasse automatisch von der API initialisiert? Ich habe denselben Package Namen & Klasse verwendet und habe bis jetzt keine Fehler.
Wie sorge ich dafür, dass der Code von dem originalen Code ersetzt wird?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3
S static methoden Allgemeine Java-Themen 9
J coole Methoden Allgemeine Java-Themen 6
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
P Methoden und Werte Allgemeine Java-Themen 17
E Performace/Ausführungszeit von Methoden ermitteln Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben