2009-11-14 15 views
8

हाय क्या एक क्लास लोडर संदर्भ (एट्रिब्यूट इत्यादि) को एक क्लासलोडर से कॉपी करने का एक तरीका है (उदाहरण के लिए 'बनाया गया' क्लास प्वाइंट) दूसरे क्लासलोडर में?एक क्लासलोडर से दूसरे क्लासलोडर से जावा ऑब्जेक्ट/क्लास की प्रतिलिपि बनाएँ

बनाना स्पष्ट, उदाहरण:

class Point { 
int x; 
int y; 
public Point() {} 
//getters and setters 
: मैं सीएल 1. अब एक और CL2 पर चल रहा है पर एक वस्तु प्वाइंट है, मैं कुछ obj सीएल 3. में इस वस्तु creat करने के लिए

चाहते

सीनरी:

... 
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(); 

लेकिन मैं sun.reflection (उपलब्ध नहीं) और क्रमबद्धता उपयोग नहीं कर सकते CL2 अपने आप के बाद से काम नहीं करता है कैली सीएल के साथ ऑब्जेक्ट "पुनर्निर्माण" 1.

एक समाधान जिसे मैंने खरीदा था वह "100%" जावा प्रतिबिंब rconstruct था, मूल रूप से सीएल 2 से ऑब्जेक्ट के क्षेत्र प्राप्त कर रहा था और नए ओबीजे पर स्थापित किया गया था।

पुनश्च: (

+0

आप समस्या के संदर्भ के बारे में थोड़ा और अधिक विस्तृत सकते हैं?कार्यात्मक आवश्यकताओं और वास्तविक समस्या के बारे में कुछ और बताएं जिसके लिए आपको लगता है कि यह समाधान है। पहली बात जो दिमाग में आती है वह यह है कि आप वास्तव में क्रमबद्धता की तलाश में हैं। – BalusC

+0

महान सवाल। दुर्भाग्यवश, कोई अच्छा जवाब नहीं: मेरे पास दो क्लासलोडर हैं, जिनमें से एक कक्षा और एक जो जानता है। –

उत्तर

7

'कैसे ClassLoaders के बीच वर्गों कॉपी करने के लिए पर Transloader देखें कि आप निम्न में से एक कार्य करना होगा:: यह जावा 1.4.2 पर चलने की जरूरत है

  • क्लोन लगभग एक और

  • करने के लिए एक classloader से किसी भी वस्तु ग्राफ एक विदेशी classloader से किसी भी वस्तु ले लो और किसी भी विधि आह्वान इस पर क्लोनिंग यह

+0

यही वह था जो मैं ढूंढ रहा था, धन्यवाद! –

+0

एचएम, यहां काम नहीं किया: '( –

+0

चूंकि मैं सूर्य का उपयोग नहीं कर सकता हूं। इसका चयन बड़े पैमाने पर किया जाता है:' ( –

0

तो वर्ग आप अपने मामले में यह वर्णन जितना आसान है बिना, आप XMLEncoder पर दिखाई दे सकता है। इसका उपयोग करके महत्वपूर्ण प्रतिबंध हैं, लेकिन साधारण मामलों में इसे नौकरी मिलनी चाहिए।

संपादित करें: इस सीमा को देखते हुए, मैं कहूंगा कि डेटा को मानचित्र में रखें और इसका उपयोग करें। आप दो वर्गों को आंतरिक रूप से मानचित्र में अपने राज्य को स्टोर भी कर सकते हैं ताकि आंदोलन बहुत तरल हो।

यदि यह काम नहीं कर सकता है, तो ऐसा लगता है कि डेटा की जटिलता के आधार पर आप अपने स्वयं के एक्सएमएल/जेएसओएन या सिर्फ सादे सीएसवी को रोल कर रहे हैं।

+0

अच्छा विचार है, लेकिन दुर्भाग्य से मैं ME पर सीडीसी PBP काम कर रहा हूँ, और मैं एक सीमित सेम है :(, मैं दुर्भाग्य से न वहाँ xmlencoder है: '( कोई आसान समाधान? –

+0

मैं डेटा पर नहीं डाल सकता एपी क्योंकि मुझे नहीं पता कि मैं किस प्रकार की वस्तु को स्टोर करूंगा। प्रतिबिंब के माध्यम से विशेषताओं को इंजेक्शन देने के बारे में आप क्या सोचते हैं? : 3 मैंने कोशिश की लेकिन इसका वास्तव में बुरा कोड ... आगे नहीं बढ़ गया :( –

+0

मैंने सोचा कि आप प्रतिबिंब का उपयोग नहीं कर सकते हैं? मैं उलझन में हूं। – Yishai

1

मेरा मानना ​​है कि उनके पास एक ही कक्षा है (उसी नाम के साथ) लेकिन दो क्लासलोडर्स द्वारा लोड और परिभाषित किया गया है। करने के लिए सबसे अच्छी बात यह है कि आपके सिस्टम को ठीक करें ताकि कक्षा लोड न हो और दो बार।

0

पावरमोक क्लासलोडिंग ट्रांसलोडर के समान कुछ भी प्रदान करता है और यह (कुछ) प्रतिबिंब जैसे अधिक अग्रिम उपयोग मामलों का समर्थन करता है। आप आसानी से निष्पादित कर सकते हैं एक Runnable या प्रतिदेय:

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

SVN रेपो में test case पर एक नज़र डालें।

यह भी Maven में उपलब्ध है:

 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-classloading</artifactId> 
    <version>1.4.6</version> 
</dependency> 
संबंधित मुद्दे