java - একটি ক্লাস অবজেক্ট জাভাতে অন্য ক্লাস অবজেক্টের উপশ্রেণী হয় কিনা তা পরীক্ষা করুন




class reflection (6)

আরেকটি বিকল্প উদাহরণ:

Object o =...
if (o instanceof Number) {
  double d = ((Number)o).doubleValue(); //this cast is safe
}

আমি জাভা এর প্রতিচ্ছবি API এর সাথে প্রায় খেলছি এবং কিছু ক্ষেত্র পরিচালনা করার চেষ্টা করছি। এখন আমি আমার ক্ষেত্রের ধরন চিহ্নিত সঙ্গে আটকে আছি। স্ট্রিংগুলি সহজ, কেবল myField.getType().equals(String.class) । একই অন্যান্য অ derived ক্লাসের জন্য প্রযোজ্য। কিন্তু আমি কিভাবে উদ্ভূত ক্লাস চেক করতে পারি? যেমন LinkedList subclass হিসাবে LinkedList List । আমি isSubclassOf(...) খুঁজে পাচ্ছি না isSubclassOf(...) বা extends(...) পদ্ধতি। আমি সব getSuperClass() মাধ্যমে পায়চারি করা এবং আমার নিজের দ্বারা আমার supeclass খুঁজে পেতে হবে?


একটি Class<?> অন্য Class<?> একটি সাব Class<?> কিনা তা যাচাই করার জন্য একটি পুনরাবৃত্তিমূলক পদ্ধতি ...

এর answer উন্নত সংস্করণ:

protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) {
    if (superClass.equals(Object.class)) {
        // Every class is an Object.
        return true;
    }
    if (clazz.equals(superClass)) {
        return true;
    } else {
        clazz = clazz.getSuperclass();
        // every class is Object, but superClass is below Object
        if (clazz.equals(Object.class)) {
            // we've reached the top of the hierarchy, but superClass couldn't be found.
            return false;
        }
        // try the next level up the hierarchy.
        return isSubclassOf(clazz, superClass);
    }
}

এটি আমার জন্য কাজ করে:

protected boolean isTypeOf(String myClass, Class<?> superClass) {
    boolean isSubclassOf = false;
    try {
        Class<?> clazz = Class.forName(myClass);
        if (!clazz.equals(superClass)) {
            clazz = clazz.getSuperclass();
            isSubclassOf = isTypeOf(clazz.getName(), superClass);
        } else {
            isSubclassOf = true;
        }

    } catch(ClassNotFoundException e) {
        /* Ignore */
    }
    return isSubclassOf;
}

এটি @ Schuttek এর উত্তরের একটি উন্নত সংস্করণ। এটি উন্নত করা হয়েছে কারণ এটি সঠিকভাবে প্রাইমিটাইভগুলির জন্য মিথ্যাটি ফেরত দেয় (যেমন, isSubclassOf (int.class, Object.class) => false) এবং সঠিকভাবে ইন্টারফেসগুলিকে পরিচালনা করে (যেমনঃSubclassOf (HashMap.class, Map.class) => true)।

static public boolean isSubclassOf(final Class<?> clazz, final Class<?> possibleSuperClass)
{
    if (clazz == null || possibleSuperClass == null)
    {
        return false;
    }
    else if (clazz.equals(possibleSuperClass))
    {
        return true;
    }
    else
    {
        final boolean isSubclass = isSubclassOf(clazz.getSuperclass(), possibleSuperClass);

        if (!isSubclass && clazz.getInterfaces() != null)
        {
            for (final Class<?> inter : clazz.getInterfaces())
            {
                if (isSubclassOf(inter, possibleSuperClass))
                {
                    return true;
                }
            }
        }

        return isSubclass;
    }
}

উদাহরণস্বরূপ উদাহরণ বস্তুর উপর, উদাহরণস্বরূপ। কখনও কখনও আপনি ক্লাস সঙ্গে সরাসরি কাজ করতে চান। এই ক্ষেত্রে আপনি ক্লাস বর্গের এসবস ক্ল্যাস পদ্ধতি ব্যবহার করতে পারেন। কিছু উদাহরণ:

1)

    Class o=Object.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

JFrame অবজেক্টের সাবক্লাস হিসাবে এটি মসৃণভাবে চলবে। সি একটি ক্লাস অবজেক্ট JFrame ক্লাস প্রতিনিধিত্ব করে থাকে।

2)

    Class o=JButton.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

এটি একটি java.lang.ClassCastException চালু করবে কারণ JFrame JButton এর উপশ্রেণী নয়। সি শুরু হবে না।

3)

    Class o=Serializable.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

JFrame java.io.Serializable ইন্টারফেস প্রয়োগ করে কারণ এটি সহজেই চলবে। সি একটি ক্লাস অবজেক্ট JFrame ক্লাস প্রতিনিধিত্ব করে থাকে।

অবশ্যই প্রয়োজনীয় আমদানি অন্তর্ভুক্ত করা আছে।


উভয় অপসারণ () এবং সন্নিবেশ () উভয় অ্যারেস্টিস্ট এবং লিঙ্কডলিস্টগুলির জন্য O (n) এর রানটাইম দক্ষতা রয়েছে। যাইহোক, রৈখিক প্রক্রিয়াকরণের সময় পিছনে কারণ দুটি খুব ভিন্ন কারণে আসে:

একটি অ্যারেস্টিস্টে, আপনি O (1) এ উপাদানটি পেতে পারেন, তবে আসলে কোনও সরানো বা সন্নিবেশ করা এটি O (n) করে তোলে কারণ নিম্নলিখিত সমস্ত উপাদানগুলি পরিবর্তন করতে হবে।

লিঙ্কেডলিস্টে, এটি আসলেই পছন্দসই উপাদানটি পেতে O (n) নেয়, কারণ আমরা যত তাড়াতাড়ি শুরুতে শুরু করি, যতক্ষণ না আমরা পছন্দসই সূচী পৌঁছায়। প্রকৃতপক্ষে অপসারণ বা সন্নিবেশ করা ধ্রুবক, কারণ আমরা কেবল সরিয়ে () এবং সন্নিবেশ () এর জন্য 2 রেফারেন্সের জন্য 1 রেফারেন্স পরিবর্তন করতে হবে।

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

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





java class reflection