Eine geladene Klasse aus dem Speicher holen?

Status
Nicht offen für weitere Antworten.

dhomas

Mitglied
Tag allerseits,

Ich habe hier ein Java-Programm laufen, welches aus Klasse A und Klasse B besteht.
Darin wird der Klasse B wird ein Objekt von A übergeben.

Jetzt meine Frage: Kann ich - in der Klasse B irgendwie an den Bytecode der Klasse A kommen?
Den würde ich z.B. gerne auf mener Festplatte abspeichern.
Der muss doch irgendwo im Speicher sitzen. Da müsste man doch drauf Zugriff bekommen, weil's ja im gleichen Prozess läuft, oder?

Gibt's für sowas nicht irgendwelche eleganten Methoden? Hab hier und da mal ein bisschen was über ClassLoader und Konsorten gelesen ( Class<?> findClass(String name) vielleicht?), kann man da irgendwas deichseln?

Zur Not würde ich sogar mit irgendwelchen Offsets im Speicher rumkramen - wenn das nötig ist, könntet ihr mir da ne Starthilfe geben?

besten Dank,
dhomas
 
versteh den sinn nicht ?

du hast doch von beiden Klassen eine class auf der platte liegen ?!

wenns ums serialisieren geht (persistent machen) dann gibts da andere methoden
 
du koenntest per Classloader die Quelle rausbekommen und dann mit einem Reader und Writer die Class-Datei kopieren....was fuer mich - siehe deathbyaclown - wenig Sinn macht;-)

Schreib mal was du erreichen willst.
 
deathbyaclown hat gesagt.:
du hast doch von beiden Klassen eine class auf der platte liegen ?!

Leider nicht, ich hab nur die Klasse B auf meiner Platte.
Auf einem anderen Rechner läuft ein Programm mit beiden Klassen (an den schicke ich meine Klasse B), und ich möchte nun in meine Klasse B einbauen, dass er sich irgendwie die Klasse A aus dem Speicher angelt (kein Dateizugriff) und sie mir zukommen lässt - sollte doch möglich sein?
 
Die Schritte sind:

Der Recher der nur 1 Klasse hat, laesst sich von dem Zweiten die zweite Klasse schicken. Irgendwie als IOStream, dann kann man glaube ich dem Classloader ein byte-Array oder so uebergeben und der macht daraus dann eine Klasse. In der Theorie sollte das so funktionieren, in der Praxis eigentlich auch....
 
Danke für die Antworten, aber mein Problem ist:
ich kann dem anderen Computer nicht einfach sagen, dass er die Klasse von der Platte holen und mir schicken soll 😉

Das Programm läuft auf einem Rechner, der nicht bei mir steht, und in dem Programm werden auch beide Klassen völlig normal geladen.
Die Klasse B steuere ich bei - die muss ich auf dem Server speichern, bevor das Programm gestartet werden kann.

Dann aber wird es völlig normal gestartet - wobei nur der Code von Klasse B von mir ist. Jetzt will ich aber in diesen Code eine Funktion einbaut, die sich die Klasse A (auf die ich in dem Programm von der Klasse B aus Zugriff habe) aus dem Speicher liest, sie eben z.B. in ein byte-Array setzt und mir per Internet schickt.
Sodass ich das dann nur noch in eine .class - Datei stecken müsste und ich hätte Klasse A bei mir.

Das muss aber aus dem Speicher kommen - Dateizugriff hab ich nicht.
Aber trotzdem sollte das doch möglich sein, oder?
 
dhomas hat gesagt.:
Das muss aber aus dem Speicher kommen - Dateizugriff hab ich nicht.
Aber trotzdem sollte das doch möglich sein, oder?

Du möchtest also über ein Class-Objekt an den zugrundeliegenden den Bytecode herankommen? M.E. ist das i.A. nicht möglich (und sollte es auch nicht sein). Dazu müsste man wohl in den Classloader eingreifen, denn nur der hat - wenn eine seiner defineClass-Methoden aufgerufen wird - mit dem Bytecode zu tun.
 
Ja, das war so in etwa mein Plan 😉

Aber der Bytecode muss ja trotzdem irgendwo im Speicher liegen, oder?
Kann man nicht irgendwie auf den "rohen" Speicher zugreifen - zumindest auf den Teil, der den eigenen Prozess betrifft?
In C ging das doch ziemlich ordentlich...?

Oder betreibt die JVM so ein Chaos, dass es unmöglich sein muss, da etwas zu finden?
 
dhomas hat gesagt.:
Ja, das war so in etwa mein Plan 😉

Aber der Bytecode muss ja trotzdem irgendwo im Speicher liegen, oder?
Ich bin mir nicht sicher, ob der unveränderte Bytecode so im Speicher zu finden ist - Just-In-Time-Compilierung bzw. Hot-Spot-Technologie können möglicherweise dafür sorgen, dass das Abbild im Speicher anders ist als in der Class-Datei.

Kann man nicht irgendwie auf den "rohen" Speicher zugreifen - zumindest auf den Teil, der den eigenen Prozess betrifft?
In C ging das doch ziemlich ordentlich...?
In Java kannst Du nicht direkt auf irgendwelche Speicherbereiche zugreifen, dazu müsstest Du per JNI (z.B.)C-Code integrieren.

Oder betreibt die JVM so ein Chaos, dass es unmöglich sein muss, da etwas zu finden?
Chaos würde ich das zwar nicht nennen, aber m.E. muss man wirklich damit rechnen, dass sich im Speicher nicht der vollständige Bytecode wiederfindet.

BTW: bist Du Dir sicher, dass man aus einem beliebigen C-Programm heraus einfach einen Teil des (eigenen) Heaps in eine Datei schreiben kann, um eine lauffähige Exe des gleichen Programms zu erzeugen? Ich glaube das eher nicht.
 
Nicht so direkt - aber ich hatte gehofft, da ließe sich mit Java was machen 😉

Vielen Dank auf alle Fälle für die Antworten.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben