2013-04-10 4 views
8

के साथ इसे पहचान सकूं, मुझे कुछ क्लोजर फ़ंक्शंस को "विशेष" के रूप में टैग करने की आवश्यकता है ताकि जावा कोड उन्हें प्रतिबिंब का उपयोग करने के रूप में पहचान सके। मैंने फ़ंक्शन में एनोटेशन जोड़ने की कोशिश की है, लेकिन जाहिर है कि यह समर्थित नहीं है। मैंने reifyIFn का विस्तार करने वाला इंटरफ़ेस (ताकि जावा कोड फ़ंक्शन ऑब्जेक्ट को पहचान सके) की कोशिश की हो, लेकिन यह अच्छा नहीं है क्योंकि क्लोजर सीधे invoke को लागू करने वाले कोड के रूप में संशोधित विधि का उपयोग नहीं करता है, बल्कि एक अप्रत्यक्ष कॉल Afunction ऑब्जेक्ट जो वास्तव में विधि को लागू कर रहा है (मुझे वास्तविक फ़ंक्शन कोड के साथ वास्तविक invoke विधि टैग करने की आवश्यकता है)।मैं क्लोजर फ़ंक्शन को कैसे टैग करूं ताकि मैं जावा प्रतिबिंब

कोई भी विचार?

संपादित करें: एएसएम लाइब्रेरी (नियमित प्रतिबिंब के बजाए) के साथ उपयोग किए जा सकने वाले तरीके से टैगिंग भी ठीक रहेगी, लेकिन मुझे किसी भी तरह वास्तविक AFunction ऑब्जेक्ट या invoke विधि टैग करने की आवश्यकता है। इसके अलावा, मैं वास्तविक AFunction ऑब्जेक्ट तक नहीं पहुंच सकता - मुझे कक्षा में दिखाई देने वाला टैग चाहिए।

उत्तर

3

आप जो मेटा डेटा (मानचित्र) किसी भी वस्तु है कि IMeta इंटरफ़ेस (जो पता चला है के रूप में IObj IMeta प्रदान करता है और हर विस्तार IObj आपत्ति हर वस्तु होने के लिए) को लागू करता है के साथ संलग्न करने की अनुमति देता clojure मेटा डेटा सुविधा का उपयोग कर सकते हैं

अब 2 विकल्प हैं।

1) आप एक वर (वास्तविक IFN वस्तु को वर अंक) के लिए मेटा डेटा संलग्न कर सकते हैं

(defn hello {:name "hello"} [] 10) 

और आप वर नमस्ते की पकड़ हो और IMeta तरीकों का उपयोग पाने के लिए जावा की ओर मेटा डेटा और पता लगाएं कि आपका विशिष्ट मेटा डेटा वहां है या नहीं। इस समस्या में यह हो सकता है कि आपका जावा कोड एक्सेस/IFn ऑब्जेक्ट्स को उनके वर्र्स (उदा: बेनामी फ़ंक्शंस) के बजाय सीधे हल करें, इसे हल करने के लिए दूसरा विकल्प आज़माएं।

2) समारोह वस्तु ही मेटा डेटा संलग्न करें:

(def hello (with-meta (fn [] 10) {:name "hello"})) 

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

+0

धन्यवाद! दुर्भाग्यवश, मेरे पास आईएफएन ऑब्जेक्ट तक पहुंच भी नहीं है - केवल इसकी कक्षा में। मुझे कक्षा को टैग करने की ज़रूरत है (मुझे किसी विशिष्ट जानकारी को भी संलग्न करने की आवश्यकता नहीं है, यह निर्धारित करने का एक तरीका है कि कक्षा किसी भी तरह "चिह्नित" है या नहीं। मैंने आवेक विधि को टैग करके इसे टैग करने के बारे में सोचा था कि यह एक प्रसिद्ध चेक अपवाद फेंकता है, लेकिन क्लोजर से ऐसा करने का कोई तरीका नहीं है। – pron

+0

क्या आप क्लोजर और जावा के कुछ नमूना कोड प्रदान कर सकते हैं यह दिखाने के लिए कि क्लोजर से कक्षा कैसे बनाई जाती है और जावा से एक्सेस किया जाता है क्योंकि इससे प्रश्न अधिक स्पष्ट हो जाएगा – Ankur

+0

मैं कुछ कक्षाओं के लिए जावाएजेंट का उपयोग करता हूं। जब एक नई कक्षा लोड हो जाती है तो मुझे अधिसूचित किया जाता है। मैं किसी भी तरह क्लोजर फ़ंक्शन को टैग करना चाहता हूं ताकि मुझे पता चले कि इसे उपकरण की आवश्यकता है या नहीं। – pron

0

यह पता चला के रूप में छोड़ दिया है साथ में थोड़ा और अधिक defn likish बनाया जा सकता है कि आप एक स्थानीय परिभाषा युक्त एक लेट कथन कि साथ समारोह शरीर संलग्न अगर परिवर्तनीय नाम क्लास फ़ाइल में विधि की स्थानीय तालिका में दिखाई देगा। थोड़ा बोझिल, यद्यपि। अभी भी एक बेहतर तरीका की तलाश में है।

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