2009-08-14 16 views
22

क्या वर्चुअल मशीन उसी वीएम के भीतर से शुरू होने के बाद जावावार्ट डालना संभव है?प्रोग्राम शुरू होने के बाद जावा एजेंट शुरू करना

उदाहरण के लिए कहें कि हमारे पास एक जार myagent.jar में उचित मेटा डेटा सेट-अप और एक एजेंटमाइन विधि पहले से कार्यान्वित किया गया है। अब उपयोगकर्ता प्रोग्राम एपीआई कॉल को कॉल करता है जिसके परिणामस्वरूप एजेंट का सम्मिलन हो सकता है ताकि वह कक्षाओं को फिर से परिभाषित कर सके।

क्या यह किया जा सकता है और कैसे?

उत्तर

4

आप जावा 6 में यह करने के लिए सक्षम होना चाहिए,

संपादित करें "वीएम स्टार्टअप के बाद शुरू एजेंटों" package documentation अध्याय देखें: हो सकता है कि यह पहले से ही जावा 5 में संभव हो गया था और सिर्फ javadocs यह उल्लेख नहीं था कि स्पष्ट रूप से

+0

यह निर्दिष्ट नहीं करता कि विधि कॉल क्या है। इसके अलावा आगे देख रहे हैं ((URLClassLoader) ClassLoader.getSystemClassLoader())। AddURL (....) जहां यूआरएल ने myagent.jar परिणाम को इंगित किया है एजेंट एजेंट को बुलाया जा रहा है? –

+0

क्या यह जावा 6 सामान्य है या केवल हॉटस्पॉट के साथ है? –

+0

@ पॉल: मैंने कोशिश नहीं की है इसलिए मैं यह नहीं कह सकता कि यह ऐसा काम करता है लेकिन यह उचित लगता है। हालांकि इसे संरक्षित होने के बाद आपको प्रतिबिंब द्वारा addURL को कॉल करना होगा। कुछ ऐसा: URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); \t कक्षा sysclass = URLClassLoader.class; \t कोशिश करें { \t \t विधि विधि = sysclass.getDeclaredMethod ("addURL", पैरामीटर); \t \t method.set अक्षम (सत्य); \t \t method.invoke (sysloader, नया ऑब्जेक्ट [] {yourURL}); \t} – HerdplattenToni

18

https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ में एक एजेंट को लिखने के साथ-साथ फ्लाई पर एक को कैसे शुरू किया जाए, इसका एक बड़ा उदाहरण है।

+3

लिंक्ड उदाहरण अपूर्ण है और काम नहीं करता है। –

+3

यह एक स्वयं निहित ट्यूटोरियल, सच नहीं है। लेकिन यह उन्नत जावा डेवलपर्स के लिए एक महान उदाहरण है। मैं, व्यक्तिगत रूप से, उदाहरण के साथ कोई समस्या नहीं थी। –

+1

लिंक टूटा हुआ है। मैं इसे WayBackMachine पर संग्रहीत करने में सक्षम था: https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with -जवागेंट्स/ – 11101101b

12

हां, आपको बस VirtualMachine.attach(String pid) विधि पर JVM प्रक्रिया आईडी पास करनी है, और एजेंट जार लोड करना होगा। VirtualMachine कक्षा जेडीके_एचओएमई/lib/tools.jar फ़ाइल में उपलब्ध है। यहां एक उदाहरण दिया गया है कि मैं रनटाइम पर एजेंट कैसे सक्रिय करता हूं:

public static void attachGivenAgentToThisVM(String pathToAgentJar) { 
    try {                    
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();             
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));             
    VirtualMachine vm = VirtualMachine.attach(pid);                    
    vm.loadAgent(pathToAgentJar, ""); 
    vm.detach(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
}                            
+0

पर्याप्त होना चाहिए। लेकिन जब मैं वही कोशिश कर रहा हूं लेकिन मुझे अपवाद मिला ** com.sun.tools.attach.AgentLoadException: एजेंट जेएआर नहीं मिला या कोई एजेंट-क्लास विशेषता ** – madhu

+1

मुझे संदेह है कि यह एक निर्भरता मुद्दा है, यहां मैवेन में कैसे हल करें : http://m.blog.csdn.net/blog/chendeng8899/8487336 ("रनटाइम पर एक जावाजेंट की गतिशील लोडिंग" खंड) – pierpytom

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