2008-11-12 12 views
86

अब मैं एक grails परियोजना में दूसरों के साथ मिलकर काम कर रहा हूँ। मुझे कुछ जावा-क्लास लिखना है। लेकिन मुझे ग्रोवी के साथ बनाई गई एक खोज योग्य वस्तु तक पहुंच की आवश्यकता है। ऐसा लगता है कि इस ऑब्जेक्ट को डिफ़ॉल्ट-पैकेज में रखा जाना है।डिफ़ॉल्ट-पैकेज में जावा-क्लास तक कैसे पहुंचे?

मेरा प्रश्न है: क्या इस ऑब्जेक्ट को जावा-क्लास से नामित पैकेज में डिफ़ॉल्ट-पैकेज में एक्सेस करने का कोई तरीका है?

उत्तर

115

You can’t use नामित पैकेज से डिफ़ॉल्ट पैकेज में कक्षाएं।

पहले J2SE 1.4 आप जा सकते थे (तकनीकी तौर पर आप कर सकते हैं, के रूप में शारिक अब्दुल्ला की answer प्रतिबिंब एपीआई के माध्यम से में दिखाया गया है, अनाम नाम स्थान से लेकिन कक्षाएं गुंजाइश में नहीं एक आयात घोषणा में हैं) डिफ़ॉल्ट पैकेज से आयात कक्षाएं इस तरह एक सिंटैक्स का उपयोग:

import Unfinished; 

कि no longer allowed है। तो एक पैक किए गए वर्ग के भीतर से एक डिफ़ॉल्ट पैकेज वर्ग तक पहुंचने के लिए डिफ़ॉल्ट पैकेज क्लास को अपने पैकेज में ले जाना आवश्यक है।

यदि आपके पास ग्रोवी द्वारा उत्पन्न स्रोत तक पहुंच है, तो फ़ाइल को समर्पित पैकेज में स्थानांतरित करने के लिए कुछ पोस्ट-प्रोसेसिंग की आवश्यकता है और इसकी शुरुआत में यह "पैकेज" निर्देश जोड़ें।


अद्यतन 2014: bug 6975015, JDK7 और JDK8 के लिए, अनाम पैकेज से आयात के खिलाफ एक और भी सख्त निषेध का वर्णन।

TypeName कक्षा प्रकार, इंटरफ़ेस प्रकार, एनम प्रकार, या एनोटेशन प्रकार का कैनोलिक नाम होना चाहिए।
प्रकार को या तो पैकेज नामित के एक सदस्य, या एक प्रकार जिसका सबसे बाहरी lexically संलग्न प्रकार एक नामित पैकेज, या एक संकलन समय त्रुटि का एक सदस्य है तब होता है का सदस्य होना आवश्यक है।

+7

जैसा कि मैंने पहले अन्य लोगों को समझाया है, डिफ़ॉल्ट पैकेज जावा दुनिया में एक द्वितीय श्रेणी का नागरिक है। बस ऐसा मत करो। :-) –

+1

लगता है कि मुझे ग्रूवी (बहुत समय-बाधित परियोजना पर) या डिफ़ॉल्ट-पैकेज में कोड सीखना है। :-( – Mnementh

+11

@ क्रिसजेस्टर-यंग यदि ऐसा है तो यह पहले स्थान पर क्यों है? डिज़ाइन त्रुटि? – Pacerier

3

आप Groovy कोड में संकुल का उपयोग कर सकते हैं, और चीजें ठीक काम करेगी।

इसका मतलब grails-app के तहत कोड का मामूली पुनर्गठन और पहले दर्द का थोड़ा सा मतलब हो सकता है, लेकिन एक बड़ी grails परियोजना पर, यह केवल संकुल में चीजों को व्यवस्थित करने के लिए समझ में आता है। हम जावा मानक पैकेज नामकरण सम्मेलन com.foo.<app>.<package> का उपयोग करते हैं।

डिफ़ॉल्ट पैकेज में सबकुछ होने के बाद, आप एकीकरण के लिए बाधा बन जाते हैं।

नियंत्रक एक ग्रेल्स आर्टिफैक्ट (या आर्टेफैक्ट) प्रतीत होते हैं जो जावा पैकेज में डालने का विरोध करता है। शायद अभी तक मुझे अभी तक पता नहीं लगा है। ;-)

58

वास्तव में, आप कर सकते हैं।

प्रतिबिंब API का उपयोग करके आप अब तक किसी भी वर्ग तक पहुंच सकते हैं।

rule * <target package name>[email protected] 

स्रोत जार फ़ाइल का डिफ़ॉल्ट पैकेज में सभी वर्गों लक्ष्य पर आ जाएगा: कम से कम मैं

Class fooClass = Class.forName("FooBar"); 
Method fooMethod = fooClass.getMethod("fooMethod", String.class); 

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it"); 
+0

स्कैला के लिए, निम्न कोड काम करता है: 'वैल बार =" हाय "; वैल fooClass = class.forName ("FooClass"); वैल fooMethod = fooClass.getMethod ("foo", classOf [ऐरे [स्ट्रिंग]]); वैल fooReturned = fooMethod.invoke (fooClass.newInstance(), ऐरे (बार)); ' – Jus12

+1

ग्रेट उत्तर, +1। चूंकि सवाल groovy था, हालांकि, आप बतख टाइपिंग (जैसे डक्ट टैपिंग मुझे लगता है) का उपयोग कर सकते हैं ... 'class.forName (" FooBar ")। NewInstance()। FooMethod (" मैंने यह किया ")' –

6

उपयोग jarjar :) के लिए निम्न नियम के साथ जार फ़ाइल repackage करने में सक्षम था पैकेज, इस प्रकार पहुंचने में सक्षम हैं।

+4

का एक डेमो जर्जर का उपयोग कैसे करें – BiGGZ

+0

@BiGGZ: जर्जर जिथब रेपो पर [README.md] (https://github.com/shevek/jarjar/blob/master/README.md) फ़ाइल देखें, इसका उपयोग कैसे करें चींटी, ग्रेडल या कमांड लाइन के साथ जर्जर। – Lucidiot

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