প্রতিবিম্ব ব্যবহার করে কোনও পদ্ধতি স্থির কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


106

আমি রান-টাইমে কেবলমাত্র কোনও শ্রেণীর স্থির পদ্ধতিগুলি আবিষ্কার করতে চাই, আমি কীভাবে এটি করতে পারি? অথবা, কীভাবে স্থিতিশীল এবং অ-স্থির পদ্ধতির মধ্যে পার্থক্য করা যায়।

উত্তর:


181

ব্যবহার Modifier.isStatic(method.getModifiers())

/**
 * Returns the public static methods of a class or interface,
 *   including those declared in super classes and interfaces.
 */
public static List<Method> getStaticMethods(Class<?> clazz) {
    List<Method> methods = new ArrayList<Method>();
    for (Method method : clazz.getMethods()) {
        if (Modifier.isStatic(method.getModifiers())) {
            methods.add(method);
        }
    }
    return Collections.unmodifiableList(methods);
}

দ্রষ্টব্য: এই পদ্ধতিটি সুরক্ষা দৃষ্টিকোণ থেকে আসলে বিপজ্জনক। Class.getMethods "বাইপাস [স্প্যানিশ ভাষায়] সিকিউরিটি ম্যানেজার তাত্ক্ষণিক কলারের ক্লাস লোডার উপর নির্ভর করে চেক করে" (জাভা সুরক্ষিত কোডিং গাইডলাইনগুলির 6 নং অংশ দেখুন)।

দাবি অস্বীকার: পরীক্ষিত বা সংকলিতও নয়।

নোটটি Modifierযত্ন সহ ব্যবহার করা উচিত। পতঙ্গ হিসাবে প্রতিনিধিত্ব করা পতাকাগুলি নিরাপদ নয়। একটি সাধারণ ভুল হ'ল এটি এমন প্রকারের প্রতিচ্ছবি বস্তুর উপর পরিবর্তিত পতাকা পরীক্ষা করে যা এটি প্রয়োগ করে না। এটি এমন পরিস্থিতিতে হতে পারে যে একই অবস্থানে থাকা একটি পতাকা কিছু অন্যান্য তথ্য বোঝাতে সেট করা আছে।


উত্তরটি সম্পাদনা করুন: ModifierS এর পরিবর্তে Modifier -> Modifier.isStatic (মেথড। বিটমোডিফায়ার্স ()) Thx ব্যবহার করুন উত্তরের জন্য!
টেলকন্টার

4
হ্যাঁ, ধন্যবাদ যদিও আমি দাবি করি নামটি একটি ভুল নকশা। সংশোধক কোনও সংশোধককে প্রতিনিধিত্ব করে না। তবে পুরো ক্লাসটি একটি ভুল নকশা d এবং সম্ভবত প্রতিচ্ছবি।
টম হাটিন -

বিটিডাব্লু একই ক্ষেত্রে ক্ষেত্রগুলির জন্যও কাজ করে, যা গেটমোডিফায়ারগুলিও একটি পদ্ধতি সরবরাহ করে
গ্রেগর

14

আপনি স্থির পদ্ধতিগুলি এর মতো পেতে পারেন:

for (Method m : MyClass.class.getMethods()) {
   if (Modifier.isStatic(m.getModifiers()))
      System.out.println("Static Method: " + m.getName());
}

5

পূর্ববর্তী (সঠিক) উত্তরের জন্য, এখানে একটি সম্পূর্ণ কোড স্নিপেট যা আপনি যা চান তা করে (ব্যতিক্রম উপেক্ষা করা):

public Method[] getStatics(Class<?> c) {
    Method[] all = c.getDeclaredMethods()
    List<Method> back = new ArrayList<Method>();

    for (Method m : all) {
        if (Modifier.isStatic(m.getModifiers())) {
            back.add(m);
        }
    }

    return back.toArray(new Method[back.size()]);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.