डिफॉल्ट पैकेज से क्लास इंपोर्ट कैसे करें


98

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


मैं ग्रहण 3.5 का उपयोग कर रहा हूं और मैंने डिफ़ॉल्ट पैकेज के साथ कुछ पैकेज संरचना के साथ एक परियोजना बनाई है। डिफ़ॉल्ट पैकेज में मेरा एक वर्ग है - गणक। जावा और मैं किसी भी पैकेज में (उदाहरण के लिए com.company.calc) उस वर्ग का उपयोग करना चाहता हूं । जब मैं डिफ़ॉल्ट पैकेज में वर्ग का उपयोग करने का प्रयास करता हूं, तो यह मुझे एक संकलक त्रुटि दे रहा है। यह डिफ़ॉल्ट पैकेज में वर्ग को पहचानने में सक्षम नहीं है। समस्या कहाँ हे?

गणना.जावा - स्रोत कोड

public class Calculations {
    native public int Calculate(int contextId);
    native public double GetProgress(int contextId);
    static  {
        System.loadLibrary("Calc");
    }
}

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


1
मुझे यह लिंक मिला: stackoverflow.com/questions/283816/… इस प्रश्न को बनाने के बाद।
मिशैल ज़िबोर


बेशक, इस सवाल का महत्वपूर्ण बिट यह है कि क्लास और उसके कोड को डिफ़ॉल्ट पैकेज में होना चाहिए । अब तक, प्रतिबिंब एपीआई (वास्तव में, इस सरल चीज़ के लिए एक ओवरकिल) का उपयोग करने के अलावा कोई भी जवाब एक समाधान नहीं है। यह मनमौजी है कि कैसे जावा अपने केक (डिफ़ॉल्ट पैकेज को हतोत्साहित) करने की कोशिश करता है और इसे भी खाता है (जेएनआई को इतना दृढ़ बना देता है, हममें से ज्यादातर लोग डीएलएल का उपयोग करते हैं जो डिफ़ॉल्ट पैकेज की आवश्यकता होती है)।
ADTC

कारण ऐतिहासिक लगता है, लेकिन यह कभी-कभी काटता है। उदा। `` `टी.जावा: स्टैटिक एफ़ू। * का आयात करें; class T {बार बार = नया बार (); } a / Foo.java: पैकेज ए; सार्वजनिक वर्ग फू {सार्वजनिक स्थैतिक अंतिम वर्ग बार {}} `` उपरोक्त संकलन ठीक है, हालांकि, अगर फू को डिफ़ॉल्ट पैकेज में रखा गया है, तो यह काम नहीं करता है। इस प्रकार, मैं सांख्यिकीय रूप से फू का आयात नहीं कर सकता। * ताकि फू.बार के बजाय शॉर्टहैंड बार का उपयोग किया जा सके।
केदार म्हसवडे

जवाबों:


87

वहाँ से जावा भाषा कल्पना :

अनाम पैकेज से एक प्रकार का आयात करने के लिए यह एक संकलन समय त्रुटि है।

आपको कक्षा को प्रतिबिंब या किसी अन्य अप्रत्यक्ष विधि के माध्यम से एक्सेस करना होगा।


1
वाह, मैं वास्तव में जावा बिल्कुल नहीं जानता। यह एक बड़ी मदद थी। मुझे लगता है कि मुझे अपनी कक्षा को एक पैकेज में स्थानांतरित करना होगा ...
अनूप्पे

46

डिफ़ॉल्ट पैकेज में कक्षाएं संकुल में कक्षाओं द्वारा आयात नहीं की जा सकती हैं। यही कारण है कि आपको डिफ़ॉल्ट पैकेज का उपयोग नहीं करना चाहिए।


यह डिफ़ॉल्ट स्वीकृत उत्तर होना चाहिए, क्योंकि यह सबसे उपयोगी है। धन्यवाद।
नोरप्टर

8

आपकी समस्या के लिए एक समाधान है। आप इसे प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

सबसे पहले, अपने लक्ष्य वर्ग के लिए एक इंटरफ़ेस बनाएँCalculatons :

package mypackage;

public interface CalculationsInterface {  
    int Calculate(int contextId);  
    double GetProgress(int contextId);  

}

अगला, अपना लक्ष्य वर्ग लागू करें जो इंटरफ़ेस :

public class Calculations implements mypackage.CalculationsInterface {
    @Override
    native public int Calculate(int contextId);
    @Override
    native public double GetProgress(int contextId);
    static  {
        System.loadLibrary("Calc");
    }
}

अंत में, कक्षा का एक उदाहरण बनाने के लिए प्रतिबिंब का उपयोग करेंCalculations और इसे एक प्रकार के चर में नियत करें CalculationsInterface:

Class<?> calcClass = Class.forName("Calculations");
CalculationsInterface api = (CalculationsInterface)calcClass.newInstance();
// Use it 
double res = api.GetProgress(10);

5

मैं आपको यह सुझाव दे सकता हूं, जहां तक ​​मेरे C और C ++ प्रोग्रामिंग अनुभव से पता है, एक बार, जब मुझे एक ही तरह की समस्या थी, तो मैंने इसे ".C" फ़ाइल में dll लिखित संरचना को बदलकर नाम बदलकर हल किया। फ़ंक्शन जिसने जेएनआई मूल कार्यक्षमता को लागू किया। उदाहरण के लिए, यदि आप पैकेज "com.mypackage" में अपना कार्यक्रम जोड़ना चाहते हैं, तो आप JNI कार्यान्वयन के प्रोटोटाइप को बदल दें ".C" फ़ाइल का फ़ंक्शन / विधि इस एक के लिए:

JNIEXPORT jint JNICALL
Java_com_mypackage_Calculations_Calculate(JNIEnv *env, jobject obj, jint contextId)
{
   //code goes here
}

JNIEXPORT jdouble JNICALL
Java_com_mypackage_Calculations_GetProgress(JNIEnv *env, jobject obj, jint contextId)
{
  //code goes here
}

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

function Java_com_mypackage_Calculations_Calculate(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JInt; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
//Any variables you might be interested in
begin
  //Some code goes here
end;



function Java_com_mypackage_Calculations_GetProgress(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JDouble; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
//Any variables you might be interested in
begin
//Some code goes here
end;

लेकिन, एक अंतिम सलाह: यद्यपि आप (यदि आप डेल्फी प्रोग्रामर हैं) या वे इन कार्यों के प्रोटोटाइप को बदल देंगे और डीएल फ़ाइल को फिर से जमा करेंगे, तो एक बार डीएल फ़ाइल संकलित होने के बाद, आप अपने पैकेज का नाम नहीं बदल पाएंगे "जावा" फ़ाइल फिर से। क्योंकि, इसे फिर से या आपको परिवर्तित उपसर्गों के साथ डेल्फी में कार्यों के प्रोटोटाइप को बदलने की आवश्यकता होगी (जैसे JAVA_yourpackage_with_underscores_for_inner_packages_Java_ileName_MethodName)

मुझे लगता है कि यह समस्या को हल करता है। धन्यवाद और संबंध, हर्षल मालशे


यह किसी के लिए अच्छा है जो अपनी परियोजनाओं में मूल पुस्तकालयों का उपयोग करने की कोशिश कर रहा है।
Randnum

5

कुछ नीचे से जहाँ मैंने पाया: -

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

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

Class fooClass = Class.forName("FooBar");
Method fooMethod =
    fooClass.getMethod("fooMethod", new Class[] { String.class });

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

2
प्रतिबिंब की तरह लगता है जाने के लिए एक ही रास्ता है। मेरे पास एक जेएनआई लाइब्रेरी है जो बस डिफ़ॉल्ट एक के अलावा किसी भी पैकेज में काम करने से इनकार करती है। मैंने DLL का निर्माण नहीं किया इसलिए मैं इसका पुनर्निर्माण नहीं कर सकता। मुझे जो कुछ भी करना है वह जावा में होना चाहिए। दिन बचाने के लिए धन्यवाद :)
ADTC

3

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

एक उदाहरण देने के लिए:

import my.packaged.DefaultClass;

public class MyDefaultClass extends DefaultClass {}
package my.packaged.DefaultClass;

public class DefaultClass {

   // Code here

}

1

एक नया पैकेज बनाएं और फिर नए पैकेज में डिफ़ॉल्ट पैकेज की कक्षाओं को स्थानांतरित करें और उन कक्षाओं का उपयोग करें


StackOverflow में आपका स्वागत है! शायद आप अपने उत्तर के सबसे महत्वपूर्ण हिस्सों को बेहतर ढंग से समझाने के लिए अधिक विवरण जोड़ सकते हैं। मैंने पढ़ा कि मैं एक अच्छा उत्तर कैसे लिखूं? अधिक जानकारी के लिए। इसके अलावा, एक बार जब आप अधिक प्रतिष्ठा प्राप्त करते हैं, तो आप इसे उत्तर के बजाय टिप्पणी के रूप में पोस्ट कर पाएंगे, जो अधिक उपयुक्त होगा।
फ्रांसेस्को बी।

-1
  1. एक नया पैकेज बनाएं।
  2. अपनी फ़ाइलों को डिफ़ॉल्ट पैकेज से नए पर ले जाएं।

-3
  1. उदाहरण के लिए, अपनी परियोजना में "रूट" पैकेज (फ़ोल्डर) बनाएँ।

    पैकेज स्रोत; (... / path_to_project / स्रोत /)

  2. एक स्रोत फ़ोल्डर में YourClass.class ले जाएँ। (... / path_to_project / स्रोत / YourClass.class)

  3. इस तरह आयात करें

    आयात स्रोत। YourClass;


1
बुरा जवाब, अगर वह ऐसा चाहता है, तो उसे डिफ़ॉल्ट रूप से इसकी आवश्यकता है, कुछ कस्टम पैकेज में नहीं
Enerccio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.