কোনও শ্রেণি জাভাতে কোনও ইন্টারফেস প্রয়োগ করে কিনা তা নির্ধারণ করুন


92

আমার একটা Classজিনিস আছে আমি নির্ধারণ করতে চাই যে Classবস্তুর প্রতিনিধিত্ব করে এমন একটি নির্দিষ্ট ইন্টারফেস প্রয়োগ করে। আমি ভাবছিলাম কীভাবে এটি অর্জন করা যায়?

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

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}

উত্তর:


215

আপনার ব্যবহার করা উচিত isAssignableFrom:

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

প্রকল্পটি একই হলে এটি কাজ করে। তবে আপনি যদি ইন্টারফেস কোড 1: 1 টি অনুলিপি করেন, একটি নতুন প্রকল্প এবং জার তৈরি করেন, তবে সেই জারটিকে প্লাগইন হিসাবে লোড করার চেষ্টা করুন, কলটি মিথ্যা ফিরে আসবে। নাম দিয়ে তুলনা করা তারপর "কাজ", যেমন রডি পোস্ট করেছে। তবে জাভা যেভাবে সামঞ্জস্যতা যাচাই করে তাতে কীভাবে এটি পরীক্ষা করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই। নাম দ্বারা একটি নোংরা পদ্ধতির। আপনার প্রকল্পটি একই থাকলে অবশ্যই ঠিক আছে। ................ হয়তো আমি এটি ভুল করছি: আমি প্লাগইন ফাইলের জন্য একটি URLClassLoader উদাহরণ তৈরি করি এবং এটি এর মতো লোড করি। হয়তো আমার অন্য কোনও ক্লাস লোডার চেষ্টা করা উচিত।
ড্রিমস্পেসের রাষ্ট্রপতি

4
আপনার ক্লাস লোডিংয়ের সমস্যা হচ্ছে। আপনি যদি বিভিন্ন শ্রেণীর লোডার দিয়ে একই ক্লাসটি দু'বার লোড করেন তবে দুটি Classদৃষ্টান্ত সামঞ্জস্যপূর্ণ হবে না। আপনি যেমন ত্রুটি দেখতে পেলেন java.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClassবা তেমনই অনিচ্ছায় কিছু।
ফ্ল্যাভিও

আমি এখন পর্যন্ত বিভিন্ন পদ্ধতির চেষ্টা করেছি এবং শেষ পর্যন্ত, এটি প্রমাণিত হয়েছিল যে আমার যে প্রধান সমস্যাটি ছিল তা হ'ল: আমার প্লাগইন এবং মূল প্রকল্পের ইন্টারফেসটি একই রকম ছিল, তবে তারা একই জায়গায় ছিল না, তাই নাম স্থান / ঠিকানা অন্যরকম ছিল। । BTW, আমি এখন ব্যবহার করছি: myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());এবং classToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);এবং instance = (MyIntf) classToLoad.newInstance();একটি যাদুমন্ত্র মত কাজ করে।
ড্রিমস্পেসের রাষ্ট্রপতি

17

সমস্ত প্রয়োগকৃত ইন্টারফেস পেতে আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন

Class[] intfs = clazz.getInterfaces();

10

আপনি ব্যবহার করতে পারেন class.getInterfaces()এবং তারপরে ইন্টারফেস ক্লাসটি আছে কিনা তা পরীক্ষা করে দেখতে পারেন।

Class someInterface; // the interface you want to check for 
Class x; // 
Class[] interfaces = x.getInterfaces();

for (Class i : interfaces) {
    if (i.toString().equals(someInterface.toString()) {
        // if this is true, the class implements the interface you're looking for
    }
}

এই পদ্ধতিটি প্রযুক্তিগতভাবে কাজ করবে তবে isAssignableFromফ্ল্যাভিও যেমন উল্লেখ করেছেন তেমন ব্যবহার করা আরও সহজ এবং পরিচ্ছন্ন পদ্ধতির ।
jwj

হ্যাঁ, এটি সত্য, যদিও আপনার উত্তরটি কয়েকবারের বেশি উত্সাহিত হয়েছে এবং আমি ভেবেছিলাম এটি কিছু প্রসঙ্গ যুক্ত করা কার্যকর হবে। ব্যবহার করার সময় isAssignableFromসম্ভবত পছন্দনীয়, এমন উদাহরণ থাকতে পারে যেখানে আপনাকে একটি শ্রেণীর প্রয়োগের নামগুলি দেখে ইন্টারফেসের তালিকাটি স্ক্যান করতে হবে।
jwj

এটি আসলে কাজ করে না, getInterfaces () কেবল তখনই কাজ করে যদি শ্রেণিটি সরাসরি ইন্টারফেসটি প্রয়োগ করে, যদি একটি সুপারক্লাস ইন্টারফেসটি প্রয়োগ করে বা একটি সুপার ইন্টারফেস এটি প্রসারিত করে, সেই ইন্টারফেসটি getInterfaces () দ্বারা ফিরে আসবে না। শ্রেণি প্রয়োগ করে এমন সমস্ত ইন্টারফেস পেতে আপনাকে সমস্ত সুপার ক্লাস এবং ইন্টারফেসের গাছটি অতিক্রম করতে হবে।
জেমস রোপার

যদিও এটি প্রশ্ন ছিল না।
হিমায়িত মটরশুটি রডি

1

আপনি ".ক্লাস" যোগ করে উদাহরণটি সেট করতে পারেন

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(Interface.class.isAssignableFrom(clazz))
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}

4
এই পদ্ধতির দিকে নজর রাখার জন্য, দয়া করে ফ্লেভির উত্তরটি বিবেচনা করুন। নোট করুন যে এই উদাহরণের কোডটি কয়েকটি জিনিস যা তাত্ক্ষণিকভাবে বোঝায় ClassUtilsনা : জাভার অংশ নয় (এটি পেয়ারা বা স্প্রিং এবং অন্যান্য ফ্রেমওয়ার্কে রয়েছে), Interfaceউপরে ব্যবহৃত শব্দটি নির্দিষ্ট ইন্টারফেসকে পরীক্ষা করা হচ্ছে বোঝাতে বোঝানো হয়েছে ( উদাহরণস্বরূপ, এটি এই প্রসঙ্গে জাভা কীওয়ার্ড নয়) এবং এর উদ্দেশ্যটি retValকোথাও ব্যাখ্যা করা বা উল্লেখ করা হয়নি।
jwj
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.