डिफ़ॉल्ट-पैकेज में जावा-कक्षाओं का उपयोग कैसे करें?


98

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

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

जवाबों:


129

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

J2SE 1.4 से पहले आप इस तरह एक वाक्यविन्यास का उपयोग करके डिफ़ॉल्ट पैकेज से कक्षाएं आयात कर सकते हैं:

import Unfinished;

यही कारण है कि है अब की अनुमति दी । तो एक पैकेज्ड क्लास के भीतर से डिफॉल्ट पैकेज क्लास को एक्सेस करने के लिए डिफॉल्ट पैकेज क्लास को अपने पैकेज में ले जाने की आवश्यकता होती है।

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


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

TypeNameएक वर्ग के प्रकार, इंटरफ़ेस प्रकार, enum प्रकार, या टिप्पणी का प्रकार का प्रामाणिक नाम होना चाहिए।
प्रकार या तो नामित पैकेज का सदस्य होना चाहिए , या उस प्रकार का सदस्य जिसका बाहरी रूप से सबसे छोटा संलग्न प्रकार एक नामित पैकेज का सदस्य है , या एक संकलन-समय त्रुटि उत्पन्न होती है


एंड्रियास टिप्पणियों में बताते हैं :

"क्यों [डिफ़ॉल्ट पैकेज] वहाँ पहली जगह है? डिजाइन त्रुटि?"

नहीं, यह जानबूझकर है।
जेएलएस 7.4.2। बेनाम संकुल कहते हैं: "अनाम संकुल जब छोटे या अस्थायी अनुप्रयोगों के विकास के लिए या जब सिर्फ विकास शुरुआत सुविधा के लिए मुख्य रूप से जावा SE मंच द्वारा प्रदान की जाती हैं।"


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

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

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

इसे अपदस्थ क्यों किया गया?
सुजान सिओक

@SuzanCioc का मतलब है: "J2SE1.4 के बाद, क्या आप अब डिफ़ॉल्ट पैकेज तक नहीं पहुंच सकते हैं?"
VonC

61

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

प्रतिबिंब एपीआई का उपयोग करके आप अब तक किसी भी वर्ग का उपयोग कर सकते हैं। कम से कम मैं करने में सक्षम था :)

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

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

Scala के लिए, निम्नलिखित कोड काम करता है:val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Jus12

2
शानदार जवाब, +1। चूँकि यह प्रश्न स्पष्ट था, हालाँकि, आप बतख टाइपिंग का उपयोग कर सकते हैं (जैसे कि डक्ट टेपिंग से मुझे लगता है) ...Class.forName("FooBar").newInstance().fooMethod("I did it")
बिल K

7

जार फ़ाइल को निम्न नियम से रीपैकेज करने के लिए जारज़र का उपयोग करें :

rule * <target package name>.@1

स्रोत जार फ़ाइल के डिफ़ॉल्ट पैकेज में सभी कक्षाएं लक्ष्य पैकेज में चली जाएंगी, इस प्रकार पहुंच प्राप्त करने में सक्षम हैं।


4
जजर का उपयोग करने का तरीका बहुत अच्छा होगा
BiGGZ

@BiGGZ: jarjar github repo पर README.md फ़ाइल देखें, यह देखने के लिए कि antar, gradle या कमांड लाइन के साथ jarjar का उपयोग कैसे करें।
लुसीडॉट

3

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

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

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

नियंत्रकों को ऐसा प्रतीत होता है कि एक ग्राईल आर्टवर्क (या आर्टिफैक्ट) है जो एक जावा पैकेज में रखा जा रहा है। शायद मैं अभी Conventionतक उस के लिए पता नहीं लगा है । ;-)


0

सिर्फ विचार को पूरा करने के लिए:

डिफ़ॉल्ट पैकेज के अंदर से आप नामित पैकेज में स्थित वस्तुओं तक पहुंच सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.