2011-01-28 9 views
35

क्या जेरेबेल जावासिस्ट या किसी प्रकार का बाइटकोड मैनिपुलेशन का उपयोग करता है? मैं इसे शुद्ध ब्याज से पूछ रहा हूं, मुझे वास्तव में जानने की ज़रूरत नहीं है :)जेरेबेल कैसे काम करता है?

उत्तर

43

जेआरबेल कक्षा पुनर्लेखन (एएसएम और जावसिस्ट दोनों) और संस्करण व्यक्तिगत कक्षाओं के लिए जेवीएम एकीकरण का उपयोग करता है। इसके अलावा यह वर्कस्पेस पर क्लास/संसाधन और वेब सर्वर लुकअप को रीडायरेक्ट करने के लिए ऐप सर्वर के साथ एकीकृत करता है। और यह कॉन्फ़िगरेशन (मेटाडेटा या फ़ाइलों) में परिवर्तनों को प्रसारित करने के लिए अधिकांश ऐप सर्वर और ढांचे के साथ भी एकीकृत करता है। यह छोटा है। इसमें से लंबे समय तक 10 विश्व स्तरीय इंजीनियरों को विकसित करने और समर्थन करने के लिए लगता है और हमारा वाणिज्यिक रहस्य है :)

+2

@Jevgeni Kabanov: अंतिम वर्गों की पुन: लोड संभाल JRebel करता है? – Dexter

+1

@Dexter यह करता है –

4

साइमन, जेडटी तकनीकी प्रचारक द्वारा जेआरबेल works पर यह सबसे नज़दीकी तर्क है कि मैंने पढ़ा है। अविवेक की एक परत बनाने के लिए


Jrebel उपकरणों आवेदन और JVM कक्षाएं:

यहाँ सामग्री चिपकाने। यदि किसी एप्लिकेशन क्लास को लोड किया गया है, तो सभी विधि निकायों को रनटाइम रीडायरेक्शन सेवा का उपयोग करके पुनर्निर्देशन किया जाएगा, जैसा चित्रा 2 में दिखाया गया है। यह सेवा रीलोड किए गए प्रत्येक संस्करण के लिए बनाई गई अनाम आंतरिक कक्षाओं का उपयोग करके कक्षा और विधि संस्करणों को प्रबंधित और लोड करती है। आइए एक उदाहरण देखें। हम दो तरीकों के साथ एक नया वर्ग सी पैदा हो जाएगी:

public class C extends X { 
int y = 5; 
int method1(int x) { 
    return x + y; 
} 
void method2(String s) { 
    System.out.println(s); 
} 
} 

जब कक्षा सी पहली बार के लिए भरी हुई है, JRebel उपकरणों वर्ग। इस वर्ग का हस्ताक्षर वही होगा, लेकिन विधि निकायों को अब रीडायरेक्ट किया जा रहा है। भरी हुई वर्ग अब कुछ इस तरह दिखेगा:

public class C extends X { 
int y = 5; 
int method1(int x) { 
    Object[] o = new Object[1]; 
    o[0] = x; 
    return Runtime.redirect(this, o, "C", "method1", "(I)I"); 
} 
void method2(String s) { 
    Object[] o = new Object[1]; 
    o[0] = s; 
    return Runtime.redirect(this, o, "C", "method2", "(Ljava/lang/String;)V"); 
} 
} 
रीडायरेक्ट कॉल करने के लिए

, हम बुला वस्तु में पारित, विधि के लिए पैरामीटर बुलाया गया है, हमारे वर्ग के नाम, हमारे विधि नाम और के प्रकार पैरामीटर और वापसी। JRebel भी एक विशिष्ट संस्करण पर कार्यान्वयन के साथ एक वर्ग को लोड करता है, शुरू में संस्करण 0. की कि कैसा दिखाई देता है देखते हैं:

public abstract class C0 { 
public static int method1(C c, int x) { 
    int tmp1 = Runtime.getFieldValue(c, "C", "y", "I"); 
    return x + tmp1; 
} 
public static void method2(C c, String s) { 
    PrintStream tmp1 = 
    Runtime.getFieldValue(
     null, "java/lang/System", "out", "Ljava/io/PrintStream;"); 
    Object[] o = new Object[1]; 
    o[0] = s; 
    Runtime.redirect(tmp1, o, "java/io/PrintStream;", "println","(Ljava/lang/String;)V"); 
} 
} 

अब मान लीजिए कि उपयोगकर्ता एक नई पद्धति z() जोड़ने और लागू करके अपने वर्ग सी में परिवर्तन करते हैं यह विधि 1 से। कक्षा सी अब इस तरह दिखता है:

public class C { 
int y = 5; 
int z() { 
    return 10; 
} 
int method1(int x) { 
    return x + y + z(); 
} 
... 
} 

अगली बार runtimes इस वर्ग का उपयोग करता है, JRebel का पता लगाता है कि एक नए संस्करण संकलित किया गया है और फाइल सिस्टम पर है, तो यह नया संस्करण, सी 1 लोड करता है। इस संस्करण में अतिरिक्त विधि z और method1 के लिए अद्यतन कार्यान्वयन है।

public class C1 { 
public static int z(C c) { 
    return 10; 
} 
public static int method1(C c, int x) { 
    int tmp1 = Runtime.getFieldValue(c, "C", "y", "I"); 
    int tmp2 = Runtime.redirect(c, null, "C", "z", "(V)I"); 
    return x + tmp1 + tmp2; 
} 
... 
} 

Runtime.redirect कॉल हमेशा की तरह, वर्ग सी के नवीनतम संस्करण में कराई जाएगी ताकि नई सी बुला()। Method1 (10) 15 कोड बदलने से पहले और 25 वापसी होगी बाद में। यह कार्यान्वयन बहुत सारी जानकारी और अनुकूलन को याद करता है, लेकिन आपको विचार मिलता है।

स्रोत: http://zeroturnaround.com/rebellabs/why-hotswap-wasnt-good-enough-in-2001-and-still-isnt-today/

संबंधित मुद्दे