2012-02-10 13 views
6

के साथ कक्षाएं मैं ग्राफिक्स कक्षा में कॉल का पता लगाने के लिए AspectJ का उपयोग कर रहा हूं। अब तक, मैंने javax.swing के पूर्व-बुना हुआ सेट का उपयोग किया है। * कक्षाएं और लोड होने पर मैं इन बुनाई कक्षाओं का उपयोग करने के लिए जेवीएम को बताता हूं, न कि जेडई से -Xbootclasspath/p स्विच का उपयोग करके।javax.swing के लोड समय बुनाई। * AspectJ

मैं लोड समय बुनाई मोड में स्विच करना चाहता हूं। क्या कोई मुझे लोड समय पर javax.swing बुनाई करने में मदद कर सकता है। मैंने नेट की खोज की है लेकिन फिर भी मैं इसे समझ नहीं सकता कि इसे कैसे किया जाए। मुझे पता है कि डिफ़ॉल्ट रूप से, AspectJ लोड टाइम वीवर जावा नहीं बुनाएगा। * और जावैक्स। * कक्षाएं। , WeaveJavaPackages = सच weaveJavaxPackages = सच

aop.xml में

लेकिन इस में से कोई भी क्योंकि javax.swing कक्षाओं से पहले बुनकर classloader से जुड़ा हुआ है लोड किए गए हैं मदद की: किसी का उपयोग कर

-Xset का सुझाव दिया। मुझे लगता है कि वीवर इन कक्षाओं को बिल्कुल नहीं देखता है।

मैं गतिशील रूप से javax.swing कक्षाओं को बुनाई कैसे प्रबंधित कर सकता हूं? क्या मुझे एक कस्टम क्लास लोडर लागू करना चाहिए जो पहले एक वीवर पंजीकृत करता है तो कक्षा लोडिंग करता है?

क्या कोई भी समाधान का सुझाव दे सकता है?

+0

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

+0

वास्तव में भार समय जावा बूट कक्षाओं पर बुनाई करना बहुत मुश्किल लगता है। मैंने सुना है कि कुछ लोगों ने इस कार्यान्वयन के लिए कस्टम वीवर का उपयोग किया है लेकिन कोई भी शेयर नहीं इसे कैसे करें इस पर कोई विनिर्देश। – Gonny

+1

मैं उपरोक्त टिप्पणियों से सहमत हूं कि यह करना मुश्किल होगा। शायद अगर आप हमें बताएं कि आप इसे पूरा करने की कोशिश क्यों कर रहे हैं (यानी आपकी वास्तविक समस्या क्या है) हम आपको प्रदान कर सकते हैं बुनाई के विकल्प के साथ। –

उत्तर

1

मैं किसी भी तरह से कर रहा हूँ एक विशेषज्ञ का मतलब है, लेकिन जब यह आशाजनक दिखता है:

Configuring Load-time Weaving with aop.xml files

विशेष रूप

:

<aspectj> 
    <aspects> 
    ... 
    </aspects> 
    <weaver options="-verbose"> 
    <!-- Weave types that are within the javax.* or org.aspectj.* 
     packages. Also weave all types in the foo package that do 
     not have the @NoWeave annotation. --> 
    <include within="javax.*"/> 
    <include within="org.aspectj.*"/> 
    <include within="([email protected] foo.*) AND foo.*"/> 
    ... 
    </weaver> 
</aspectj> 

मुझे यकीन है कि यह कैसे ClassPreProcessor इस्तेमाल किया दिए गए काम कर सकता था नहीं कर रहा हूँ एलटीडब्ल्यू के एजेंट द्वारा (हालांकि मैंने कोशिश नहीं की है)।

public byte[] preProcess(String className, byte[] bytes, ClassLoader loader, ProtectionDomain protectionDomain) { 
    if (loader == null || className == null || loader.getClass().getName().equals(deleLoader)) { 
     // skip boot loader, null classes (hibernate), or those from a reflection loader 
     return bytes; 
    } 
    ... 
    try { 
     synchronized (loader) { 
      ... 
      WeavingAdaptor weavingAdaptor = WeaverContainer.getWeaver(loader, weavingContext); 
      ... 
     } 
    } 
} 

कौन सा यह बहुत स्पष्ट करता है कि कैसे बूट लोडर कक्षाओं को छोड़ दिया जाता है: यहाँ अपनी preProcess विधि की शुरुआत है। इसके अलावा, WeaverContainer.getWeaver() आमंत्रण aop.xml प्रसंस्करण को ट्रिगर करने के लिए प्रतीत होता है, और ऐसा तब तक नहीं होता जब तक गैर-नल लोडर वाले वर्ग को संसाधित नहीं किया जाता है।

यकीन है कि ऐसा नहीं है कि कितना एक वास्तविक समाधान के साथ मदद करता है, लेकिन उम्मीद है कि यह क्यों चीजें जिस तरह से वे करते हैं व्यवहार करते हैं पर कुछ प्रकाश डालता है ...

0

वास्तव में आप आधे रास्ते वहाँ इसकी नहीं है कि कठिन है, बल्कि बिल्कुल स्पष्ट हैं । C:

<?xml version="1.0" encoding="UTF-8"?> 
<aspectj> 
    <aspects> 
<aspect name="com.ciena.EDTCheck"/> 
</aspects> 
    <weaver options="-Xset:weaveJavaxPackages=true -verbose">  
    </weaver> 
    </aspectj> 

सुनिश्चित करें कि आप -javaagent तरह javaagent में

aspectjweaver.jar है कि बनाओ \ aspectj1.8 \ lib \ aspectjweaver.jar

भी सुनिश्चित करें कि आपके aop।एक्सएमएल ऊपर META-INF फ़ोल्डर में है

है कि सभी ग्रहण या कुछ आईडीई

से चलाने के लिए यदि आप सुनिश्चित करें कि आप -javagaent वहाँ दे कर कमांड लाइन से चलाना चाहते हैं भी

+0

क्या आपने वास्तव में कभी कोशिश की है और यह आपके लिए काम करता है? मेरे लिए यह नहीं है। – kriegaex

2

एकमात्र समाधान मैं सुझाव दे सकता है कि javax पैकेजों के लिए आपको execution() पॉइंटकट्स का उपयोग करने की आवश्यकता है, तो जेआरई टूल्स.जर बाइनरी-बुनाई करना और अपना स्वयं का, बुना संस्करण बनाएं। मैंने पहले ऐसा किया है, यह अच्छी तरह से काम किया है। लेकिन यह केवल एक विकल्प है यदि आपके पास चल रहे रनटाइम पर्यावरण पर नियंत्रण है।

यदि आप इस तरह के दृष्टिकोण का उपयोग नहीं करना चाहते हैं, तो आपको call() पॉइंटकट का सहारा लेना होगा। इस तरह आप अपने स्वयं के आवेदन या एलटीडब्लू द्वारा प्रभावित किसी भी तृतीय पक्ष पुस्तकालय द्वारा किए गए कॉल कैप्चर कर सकते हैं। बूट क्लासलोडर द्वारा लोड किए गए जेआरई कक्षाओं द्वारा किए गए कॉल केवल आपके पहलू से बच जाएंगे, जो बहुत खराब नहीं होना चाहिए।

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