2011-03-29 8 views
5

में जावा इंटरफेस को विस्तारित (लागू नहीं किया जा रहा है) मैं हाल ही में क्लोजर में बहुत कुछ देख रहा हूं और मैं सोच रहा हूं कि यह मेरी अगली परियोजना के दायरे के अनुरूप है या नहीं। दुर्भाग्यवश, इसमें गैर-पोर्टेबल कोड लिखना शामिल है और मुझे Win32 API तक पहुंच की आवश्यकता है।क्लोजर

मैं जावा में सी इंटरफ़ेस के साथ देशी पुस्तकालयों को आसानी से मैप करने के लिए Java Native Access लाइब्रेरी पर ठोकर खाई। यह ट्यूटोरियल में एक उदाहरण के रूप में Kernel32.dll के लिए एक (खाली) रैपर भी प्रदान करता है!

हालांकि, मैं जावा से क्लोजर के उदाहरणों का अनुवाद करने के लिए थोड़ा सा स्टंप हूं। मुझे पता है कि मैं implement interfaces and implement classes कर सकता हूं, लेकिन मैं बस इंटरफ़ेस कैसे बढ़ा सकता हूं? अपेक्षा के अनुरूप

(import (com.sun.jna Library Native Platform Pointer)) 
(import (com.sun.jna.win32 StdCallLibrary)) 

(def K32 
    (gen-interface 
     :name Kernel32 
     :extends [com.sun.jna.win32.StdCallLibrary] 
     :methods [[GetCurrentProcess [] com.sun.jna.Pointer]])) 

(defn load-native-library [name interface] 
    (cast interface (com.sun.jna.Native/loadLibrary name interface))) 

(def k32 (load-native-library "kernel32" K32)) 

(println (.GetCurrentProcess k32)) 

आउटपुट #<Pointer [email protected]>:


लिंक जूस्ट के द्वारा पोस्ट के लिए धन्यवाद, यहाँ एक न्यूनतम काम कर उदाहरण है!

उत्तर

5

आप केवल एक अन्य इंटरफेस के साथ एक इंटरफेस का विस्तार कर सकते हैं। मुझे एक नुकसान है कि मौजूदा एपीआई तक पहुंचने पर आपको उस कार्यक्षमता की आवश्यकता क्यों होगी - यहां तक ​​कि जावा में भी। बस इसे लागू करें और इसके साथ किया जाए।

संपादित करें: और आमतौर पर, मेरे अनुभव में, शुद्ध जावा में अपने इंटरफेस लिखना बहुत स्पष्ट है; क्लोजर में एक नया इंटरफ़ेस परिभाषित करने का सामान्य कारण तब होता है जब आप कुछ क्लोजर कोड में जावा-फ्रेंडली इंटरफ़ेस जोड़ना चाहते हैं।

फिर से संपादित करें: यदि आप इस मामले के लिए अधिक आकर्षक पाते हैं तो आप निश्चित अंतर का उपयोग कर सकते हैं। This blog post में जेएनए तक पहुंचने के लिए इसका उपयोग कुछ उदाहरण हैं।

+0

क्योंकि जेएनए कोड मेरे लिए बैकिंग क्लास उत्पन्न करता है। पोस्ट किए गए लिंक में "जेएनए का उपयोग कैसे शुरू करें" sestion देखें। –

+0

ध्यान दें कि 'clojure.core' क्लोजर में जावा इंटरफेस को परिभाषित करने के लिए तंत्र प्रदान करता है। Http://clojuredocs.org/clojure_core/1.2.0/clojure.core/definterface देखें। हालांकि, यह एक * मौजूदा * इंटरफ़ेस को विस्तारित करने का समर्थन नहीं करता है। यह एक विशाल सीमा की तरह लगता है। –

+0

@Andre: ठीक है, मेरा जावा इतना जंगली है कि मैं वास्तव में नहीं देख सकता कि आपको वास्तव में एक नया इंटरफ़ेस परिभाषित करने की आवश्यकता है या यदि आप किसी और चीज़ से दूर हो सकते हैं। मैं फिर से अपना जवाब अपडेट कर रहा हूं। –