java - মাস্টারিং জাভা pdf




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

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


আপনি এই পদ্ধতি চান:

boolean isList = List.class.isAssignableFrom(myClass);

যেখানে সাধারণত, List (উপরে) superclass সঙ্গে প্রতিস্থাপিত করা উচিত এবং myClass subclass সঙ্গে প্রতিস্থাপিত করা উচিত

JavaDoc থেকে:

এই Class বস্তুর প্রতিনিধিত্বকারী শ্রেণি বা ইন্টারফেসটি হয় একই Class প্যারামিটার দ্বারা প্রতিনিধিত্ব করা শ্রেণির বা ইন্টারফেসের সুপারক্লাস বা সুপারিন্টারফেসের মতো হয় কিনা তা নির্ধারণ করে। এটা যদি true ফিরে আসে; অন্যথায় এটা false ফেরত। যদি এই Class বস্তুটি একটি আদিম প্রকারকে উপস্থাপন করে তবে এই পদ্ধতিটি true ফিরে আসে যদি নির্দিষ্ট Class প্যারামিটার ঠিক এই Class বস্তুটি হয়; অন্যথায় এটা false ফেরত।

রেফারেন্স:

সম্পর্কিত:

ক) কোনও বস্তুটি কোনও ক্লাস বা ইন্টারফেসের উদাহরণ (উপশ্রেণী সহ) আপনি কম্পাইল সময়তে জানেন কিনা তা পরীক্ষা করুন:

boolean isInstance = someObject instanceof SomeTypeOrInterface;

উদাহরণ:

assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);

খ) কোনও বস্তুটি ক্লাস বা ইন্টারফেস (উপশ্রেণীগুলি সহ) এর উদাহরণ যা আপনি কেবল রানটাইম এ জানেন তা দেখুন:

Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);

উদাহরণ:

public boolean checkForType(Object candidate, Class<?> type){
    return type.isInstance(candidate);
}

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

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

এটি @ 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;
    }
}

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

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;
}




reflection