2010-01-14 6 views
5

जेडीके 5 में पेश की गई उपकरण सुविधाओं का उपयोग करने के लिए, आप -javaagent ध्वज JVM को पास कर सकते हैं। यह स्थिर premain विधि में इंस्ट्रुमेंटेशन क्लास का एक उदाहरण इंजेक्ट करेगा। इस तरह की एक कक्षा में उदाहरण के लिए:मैं एक्लिप्स आरसीपी एप्लिकेशन में java.lang.instrument का उपयोग कैसे कर सकता हूं?

public class MyClass { 
    public static Instrumentation inst; 
    public static void premain(String options, Instrumentation inst) { 
     MyClass.inst = inst; 
    } 
} 

एक उपयुक्त मैनिफ़ेस्ट फ़ाइल के साथ, आप इस इस प्रकार चला सकते हैं:

java -javaagent:myfiles.jar SomeClass 

यह SomeClass से premain विधि तो main कहता है। जावा ऑब्जेक्ट के अनुमानित आकार पर अनुमान लगाने के लिए इस दृष्टिकोण का उपयोग Java.SizeOf Project में किया जाता है।

ठीक है, अब एक्लिप्स आरसीपी each bundle has its own classloader में। इसका मतलब है कि हमारे माइक्लास में संग्रहीत स्थिर इंस्ट्रूमेंटेशन ग्रहण अनुप्रयोग के लिए दृश्यमान नहीं है। जावागेंट एक वर्ग-लोडर का उपयोग करता है, ग्रहण बंडल दूसरे के साथ लोड हो जाता है। जब हम प्लगइन के भीतर से MyClass.inst तक पहुंचते हैं तो यह null है, के रूप में वर्ग एक ही वर्ग नहीं है जैसा कि जावावांट लोड होता है और premain पर कॉल किया जाता है।

आरसीपी मेलिंग सूची पर संभावित समाधान के रूप में अन्य संकेत this thread हैं। लेकिन कुछ भी निर्णायक नहीं है।

क्या इस आसपास काम करने का कोई तरीका है? Eclipsezone आलेख में संकेतित Eclipse-BuddyPolicy अच्छा लगता है। मैंने कोशिश की:

Eclipse-BuddyPolicy: app 

भाग्य के बिना मेरे प्लगइन में। मुझे Eclipse-BuddyPolicy: javaagent जैसे कुछ चाहिए। कोई विचार?

+0

आप किसी भी दिखाई दे रहा है exeptions? एक पतन में पैकेज के बिना एजेंट वर्ग है। (यानी MyClass डिफ़ॉल्ट पैकेज में नहीं हो सकता है)। क्या यह ग्रहण के बाहर काम करता है? – stacker

+0

हाँ, POJO सामान के साथ एक्लिप्स के बाहर ठीक काम करता है। वास्तव में, प्रीमियर में एक "println" ग्रहण से दिखाया जाता है, लेकिन तब किसी भी प्लगइन से बुलाए जाने पर स्थिर इंस्ट्रुमेंटेशन शून्य होता है। – richq

उत्तर

4

मुझे लगता है कि सबसे सरल समाधान वैश्विक गुण वस्तु का उपयोग करना है। एक वैश्विक गुण के रूप में पूर्व मुख्य दुकान उपकरण वस्तु है और उसके बाद हर जगह से उस तक पहुंच (गुण आपत्ति सभी वर्ग लोडर में एक ही है):

[संपादित करें: अद्यतन]

public class MyClass { 
    private static final String KEY = "my.instrumentation"; 
    public static void premain(String options, Instrumentation inst) { 
     Properties props = System.getProperties(); 
     if(props.get(KEY) == null) 
      props.put(KEY, inst); 
    } 

    public static Instrumentation getInstrumentation() { 
     return System.getProperties().get(KEY); 
    } 
} 
+0

यह एक अच्छा विचार है, लेकिन दुख की बात यह है कि यह 'सेटप्रोपर्टी (स्ट्रिंग, स्ट्रिंग)' है - आप वहां कोई पुरानी वस्तु नहीं डाल सकते हैं। – richq

+0

इसे आसानी से ठीक किया जा सकता है (मेरे उत्तर का अद्यतन संस्करण देखें): System.getProperties() एक गुण() ऑब्जेक्ट देता है जो हैशटेबल का उप-वर्ग है जिसका एपीआई सेट (स्ट्रिंग, ऑब्जेक्ट) प्रदान करता है और ऑब्जेक्ट लौटने (स्ट्रिंग) प्राप्त करता है। –

+0

इतना आसान समाधान, और यह पूरी तरह से काम करता है। धन्यवाद! – richq

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

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