2009-11-14 7 views
8

Hallo, gibt es eine Möglichkeit, einen klassengeladenen Kontext (atrributes usw.) von einem Klassenlader (zB einem 'made' Klassenpunkt) in einen anderen Klassenlader zu kopieren?Java-Objekt/Klasse von einem Klassenlader in einen anderen Klassenlader kopieren

machen klar, Beispiel: Ich habe ein Objektpunkt auf CL 1. nun auf einem anderen CL2 läuft, möchte ich diese Aufgabe in CL creat 3.

Einige obj:

class Point { 
int x; 
int y; 
public Point() {} 
//getters and setters 

Szenerie:

... 
class CL2 { 

// Running on CL 2 
... 
// Point obj from CL 1 
Object point = gotFromCL1(); 

// Want to create the object on Cl2 
Object pointCL2 = point.conversion(); 

Aber ich kann nicht sun.reflection verwenden (nicht verfügbar) und Serialisierung funktioniert nicht, da CL2 Aut nisch „rekonstruieren“, um das Objekt mit CL 1.

Eine Lösung, die ich tought war zu tun, um eine „100%“ java Reflexion rconstruct, im Grunde immer die Felder des Objekts von CL2 und auf dem neuen obj einrichten.

PS: Es muss auf Java 1.4.2 ausgeführt wird: '(

+0

Können Sie bitte etwas mehr über den Kontext des Problems näher erläutern?Erzählen Sie ein wenig mehr über die funktionalen Anforderungen und das eigentliche Problem, für das Sie denken, dass dies die Lösung ist. Als erstes fällt Ihnen ein, dass Sie tatsächlich nach einer Serialisierung suchen. – BalusC

+0

Große Frage. Leider keine gute Antwort: Ich habe zwei Klassenlader, von denen einer eine Klasse kennt und der andere nicht. –

Antwort

7

Siehe Transloader auf, wie kopieren Klassen zwischen Classloader, wenn Sie einen der folgenden Schritte tun müssen:

  • Clone fast jede Objektgraph von einem Classloader zu einem anderen

  • Nehmen Sie ein beliebiges Objekt aus einem fremden Classloader und jede Methode aufrufen auf, ohne es so einfach ist, wie Sie es in Ihrem Fall zu beschreiben, könnte man sich XMLEncoder

+0

Das war, was ich gesucht habe, danke! –

+0

Hm, hat hier nicht funktioniert: '( –

+0

Da ich sun.reflect nicht verwenden kann, das dort massiv verwendet:' ( –

0

Wenn die Klasse klonen. Es gibt erhebliche Einschränkungen bei der Verwendung, aber in einfachen Fällen sollte es die Arbeit erledigen.

EDIT: Angesichts dieser Einschränkung würde ich sagen, legen Sie die Daten in eine Karte und verwenden Sie diese. Sie könnten sogar die zwei Klassen ihren Zustand intern in einer Karte speichern lassen, so dass die Bewegung ziemlich flüssig ist.

Wenn das nicht funktioniert, dann sieht es so aus, als ob Sie eine eigene XML/JSON-Rolle oder einfach nur CSV, abhängig von der Komplexität der Daten rollen.

+0

Gute Idee, aber leider arbeite ich auf ME cdc pbp, und ich habe eine begrenzte Bean :(, ich leider nicht habe xmllencoder da: '( Irgendwelche einfachere Lösung? –

+0

Ich kann die Daten nicht auf am stellen ap, da ich nicht weiß, welche Art von Objekt ich speichern werde. Was denken Sie darüber, Attribute über Reflektion zu injizieren? : 3 Ich habe versucht, aber es ist wirklich böse Code ... nicht gelungen :( –

+0

Ich dachte, Sie können nicht Reflexion verwenden? Ich bin verwirrt. – Yishai

1

Ich glaube, er hat die gleiche Klasse (mit dem gleichen Namen) aber geladen und durch zwei Klassenlader definiert. Am besten reparieren Sie Ihr System, damit die Klasse nicht zweimal geladen wird.

0

PowerMock Classloading bietet auch etwas, das TransLoader ähnlich ist und es unterstützt mehr Anwendungsfälle wie (einige) Reflexion. Sie können einen Runnable oder kündbare leicht auszuführen:

 
ClassloaderExecutor cle = new ClassloaderExecutor(classloader); 
cle.execute(aRunnable); 
Object result = cle.execute(aCallable); // Result is cloned back to original CL 

Werfen Sie einen Blick auf die test case im SVN-Repo.

Es ist auch in Maven zur Verfügung:

 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-classloading</artifactId> 
    <version>1.4.6</version> 
</dependency> 
Verwandte Themen