java - জাভা ক্লাসে ঘোষিত স্ট্যাটিক ক্ষেত্রগুলি পুনরুদ্ধার করুন




reflection static (3)

আমার নিম্নলিখিত ক্লাস আছে:

public class Test {
    public static int a = 0;
    public int b = 1;
}

শুধুমাত্র স্ট্যাটিক ক্ষেত্রের একটি তালিকা পেতে প্রতিফলন ব্যবহার করা সম্ভব? আমি সচেতন যে আমি Test.class.getDeclaredFields() সহ সমস্ত ক্ষেত্রের একটি অ্যারে পেতে পারি। কিন্তু একটি Field উদাহরণ একটি স্ট্যাটিক ক্ষেত্র বা না প্রতিনিধিত্ব করে কিনা তা নির্ধারণ করার কোন উপায় নেই।


Thats Simple, আপনি একটি স্ট্যাটিক বা না কিনা তা পরীক্ষা করার জন্য Modifier ব্যবহার করতে পারেন। এখানে টাস্ক ধরনের জন্য একটি নমুনা কোড।

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}

আপনি এটি ভালো করতে পারেন:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}

আমি দুর্ঘটনার দ্বারা এই প্রশ্ন জুড়ে stumbled এবং স্ট্রিম ব্যবহার করে এটি একটি জাভা 8 আপডেট প্রয়োজন অনুভূত:

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

স্পষ্টত, যে নমুনা পঠনযোগ্যতা জন্য একটু বিমূর্ত। আসলে আপনি সম্ভবত এটির মতো লিখবেন:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}




field