ডিফল্ট প্যাকেজ থেকে কীভাবে ক্লাস আমদানি করা যায়


98

সম্ভাব্য সদৃশ: ডিফল্ট-প্যাকেজে জাভা-ক্লাসগুলি কীভাবে অ্যাক্সেস করবেন?


আমি Eclipse 3.5 ব্যবহার করছি এবং আমি ডিফল্ট প্যাকেজ সহ কিছু প্যাকেজ কাঠামো সহ একটি প্রকল্প তৈরি করেছি। আমার ডিফল্ট প্যাকেজটিতে একটি শ্রেণি রয়েছে - গণনা.জভা এবং আমি কোনও শ্রেণীর প্যাকেজে সেই শ্রেণীর ব্যবহার করতে চাই (উদাহরণস্বরূপ com.company.calc)। আমি যখন ডিফল্ট প্যাকেজে থাকা ক্লাসটি ব্যবহার করার চেষ্টা করি তখন এটি আমাকে একটি সংকলক ত্রুটি দেয়। এটি ডিফল্ট প্যাকেজে ক্লাসটি সনাক্ত করতে সক্ষম নয়। সমস্যা কোথায়?

গণনা.জভা - উত্স কোড

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

আমি আমার ক্লাস অন্য কোনও প্যাকেজে রাখতে পারি না। এই শ্রেণীর কিছু নেটিভ পদ্ধতি রয়েছে যা ডেলফিতে প্রয়োগ করা হয়। যদি আমি সেই ক্লাসটি কোনও ফোল্ডারে রাখি তবে আমাকে যে ডিএলএলটি এড়াতে চাইছে তার পরিবর্তন করতে হবে (সত্য - আমি তা পারি না)। এজন্য আমি আমার ক্লাসটি ডিফল্ট প্যাকেজে রেখেছি।


4
আমি এই লিঙ্কটি পেয়েছি: এই প্রশ্নগুলি তৈরি করার পরে stackoverflow.com/questions/283816/…
মিশা জাইবার


অবশ্যই, এই প্রশ্নের গুরুত্বপূর্ণ বিটটি হল ক্লাস এবং এর কোডটি ডিফল্ট প্যাকেজে থাকতে হবে । এখন পর্যন্ত কোন ব্যবহার প্রতিফলন এপিআই ছাড়া অন্য উত্তর (সত্যিই, কিছু এই সহজ একটি Overkill) হয় না একটি সমাধান। এটি জাভা কীভাবে তার কেক রাখার চেষ্টা করে (ডিফল্ট প্যাকেজটিকে নিরুৎসাহিত করে) এবং এটিও খায় (জেএনআইকে এতটাই বিশৃঙ্খল করুন, আমাদের বেশিরভাগ ডিএলএল ব্যবহার করে ডিফল্ট প্যাকেজের প্রয়োজন হয়) এটি বিস্ময়কর।
এডিটিসি

কারণটি historicতিহাসিক বলে মনে হয় তবে এটি কখনও কখনও কামড় দেয়। উদাহরণস্বরূপ `` `টি.জভা: আমদানি স্থির a.Foo। *; ক্লাস টি {বার বার = নতুন বার (); } a / Foo.java: প্যাকেজ এ; পাবলিক ক্লাস ফু {পাবলিক স্ট্যাটিক ফাইনাল ক্লাস বার {}} `` `উপরোক্ত সংকলনগুলি জরিমানা করে, তবে, ফু যদি ডিফল্ট প্যাকেজে রাখা হয়, এটি কার্যকর হয় না। সুতরাং, আমি স্থিতিভাবে ফু আমদানি করতে পারি না *
কেদার মহসওয়াদে

উত্তর:


87

জাভা ভাষার বিশেষ থেকে :

নামবিহীন প্যাকেজ থেকে কোনও প্রকার আমদানি করা এটি একটি সংকলন সময় ত্রুটি।

প্রতিচ্ছবি বা অন্য কোনও পরোক্ষ পদ্ধতির মাধ্যমে আপনাকে শ্রেণিতে অ্যাক্সেস করতে হবে।


4
বাহ আমি সত্যিই জাভা জানি না। এটি একটি দুর্দান্ত সাহায্য ছিল। অনুমান করুন আমাকে আমার ক্লাসটি একটি প্যাকেজে নিয়ে যেতে হবে ...
আনহপ্পে

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

আমি আপনাকে এই পরামর্শটি দিতে পারি, আমার সি এবং সি ++ প্রোগ্রামিং অভিজ্ঞতা থেকে যতদূর জানা যাবে, একবার যখন আমার একই ধরণের সমস্যা হয়েছিল, তখন আমি "। সি" ফাইলের নাম পরিবর্তন করে এটি সমাধান করেছিলাম ফাংশন যা জেএনআই নেটিভ কার্যকারিতা কার্যকর করে। উদাহরণস্বরূপ, আপনি যদি "com.mypackage" প্যাকেজটিতে আপনার প্রোগ্রামটি যুক্ত করতে চান তবে আপনি JNI প্রয়োগকারী "। সি" ফাইলটির ফাংশন / পদ্ধতিটিকে এইটিতে পরিবর্তন করুন:

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;

তবে, একটি চূড়ান্ত পরামর্শ: যদিও আপনি (আপনি যদি ডেলফি প্রোগ্রামার হন) বা সেগুলি এই ফাংশনগুলির প্রোটোটাইপগুলি পরিবর্তন করে এবং dll ফাইলটি পুনরায় সংকলন করে দেবে, একবার dll ফাইলটি সংকলিত হয়ে গেলে, আপনি আপনার প্যাকেজের নাম পরিবর্তন করতে পারবেন না "জাভা" ফাইলটি আবার এবং আবার। কারণ, এর জন্য আবার আপনার বা তাদের পরিবর্তিত উপসর্গ (যেমন JAVA_yourpackage_with_:30cores_for_inner_packages_JavaFileName_MethodName) দিয়ে ডেল্ফিতে ফাংশনগুলির প্রোটোটাইপগুলি পরিবর্তন করতে হবে)

আমি মনে করি এটি সমস্যার সমাধান করে। ধন্যবাদ ও শ্রদ্ধা, হর্ষাল মালশে


যে কেউ তাদের প্রকল্পগুলিতে নেটিভ গ্রন্থাগারগুলি ব্যবহার করার চেষ্টা করছেন তাদের পক্ষে এটি ভাল।
রেনডেনাম

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");

4
মনে হচ্ছে প্রতিফলনটি একমাত্র উপায়। আমার কাছে একটি জেএনআই লাইব্রেরি রয়েছে যা ডিফল্ট ব্যতীত অন্য কোনও প্যাকেজে গেলে কেবল কাজ করতে অস্বীকার করে। আমি ডিএলএল তৈরি করিনি যাতে আমি এটি পুনর্নির্মাণ করতে পারি না। আমি যা কিছু করি তা জাভাতে থাকতে হবে। দিনটি বাঁচানোর জন্য আপনাকে ধন্যবাদ :)
এডিটিসি

3

দুর্ভাগ্যক্রমে, আপনি কোনও প্যাকেজে না থাকলে কোনও শ্রেণি আমদানি করতে পারবেন না। এটি অত্যন্ত নিরুৎসাহিত হওয়ার একটি কারণ। আমি যা চেষ্টা করব তা হল এক প্রকারের প্রক্সি - আপনার কোডটি এমন কোনও প্যাকেজে রাখুন যা কিছু ব্যবহার করতে পারে তবে আপনার যদি ডিফল্ট প্যাকেজে সত্যই কিছু প্রয়োজন হয় তবে এটি একটি খুব সাধারণ শ্রেণি করুন যা আসল কোড সহ ক্লাসে কল পাঠিয়ে দেয়। অথবা, এমনকি সহজ, কেবল এটি প্রসারিত করুন।

একটি উদাহরণ দিতে:

import my.packaged.DefaultClass;

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

public class DefaultClass {

   // Code here

}

1

একটি নতুন প্যাকেজ তৈরি করুন এবং তারপরে নতুন প্যাকেজে ডিফল্ট প্যাকেজটির ক্লাসগুলি সরান এবং সেই ক্লাসগুলি ব্যবহার করুন


স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! আপনার উত্তরের সর্বাধিক গুরুত্বপূর্ণ অংশগুলি আরও ভালভাবে ব্যাখ্যা করতে আপনি আরও বিশদ যুক্ত করতে পারেন। একটি এর পড়েছেন আমি একটি ভাল উত্তর লেখো কিভাবে? আরও তথ্যের জন্য. এছাড়াও, একবার আপনি আরও খ্যাতি অর্জন করার পরে, আপনি উত্তর হিসাবে এটি একটি মন্তব্য হিসাবে পোস্ট করতে সক্ষম হবেন, যা আরও উপযুক্ত হবে।
ফ্রান্সেসকো বি।

-1
  1. একটি নতুন প্যাকেজ তৈরি করুন।
  2. আপনার ফাইলগুলি ডিফল্ট প্যাকেজ থেকে নতুনটিতে সরান।

-3
  1. উদাহরণস্বরূপ, আপনার প্রকল্পে "রুট" প্যাকেজ (ফোল্ডার) তৈরি করুন।

    প্যাকেজ উত্স; (... / পথ_ টু_প্রজেক্ট / উত্স /)

  2. সোর্স ফোল্ডারে আপনারClass.class সরান। (... / পথ_ টু_প্রজেক্ট / উত্স / আপনারক্লাস.ক্লাস)

  3. এই মত আমদানি করুন

    আমদানি উত্স। আপনার ক্লাস;


4
খারাপ উত্তর, যদি সে এটি চায় তবে তার এটি ডিফল্টরূপে দরকার, কোনও কাস্টম প্যাকেজে নয়
এনারসিসিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.