জাভা: একটি শ্রেণিতে সমস্ত পরিবর্তনশীল নাম পান


93

আমার একটি ক্লাস রয়েছে এবং আমি এর সর্বজনীন ক্ষেত্রগুলি (পদ্ধতি নয়) সন্ধান করতে চাই। কিভাবে আমি এটি করতে পারব?

ধন্যবাদ!


আপনার প্রতিবিম্ব এপিআই ব্যবহার করে এটি সক্ষম হওয়া উচিত ।
ক্রোজিন

উত্তর:


135
Field[] fields = YourClassName.class.getFields();

শ্রেণীর সমস্ত পাবলিক ভেরিয়েবলের একটি অ্যারে প্রদান করে।

getFields()পুরো ক্লাস-বংশগতিতে ক্ষেত্রগুলি ফিরিয়ে দিন। আপনি যদি ক্ষেত্রগুলি কেবল প্রশ্নে ক্লাসে সংজ্ঞায়িত করতে চান, এবং এর সুপারক্লাস নয়, নীচের পদ্ধতির getDeclaredFields()সাহায্যে publicসেগুলি ফিল্টার করুন Modifier:

Modifier.isPublic(field.getModifiers());

YourClassName.classআক্ষরিক আসলে প্রকারের একটি বস্তু প্রতিনিধিত্ব করে java.lang.Class। আরও আকর্ষণীয় প্রতিবিম্ব পদ্ধতির জন্য এর ডক্সটি পরীক্ষা করুন।

Fieldশ্রেণী উপরে java.lang.reflect.Field। আপনি পুরো java.lang.reflectপ্যাকেজটি একবার দেখে নিতে পারেন ।


4
কেবল একটি নোট - প্রাথমিকভাবে আমার উত্তরে একটি ভুল বক্তব্য রয়েছে, তবুও এটি বেশ কয়েকবার উপুড় হয়েছিল। দয়া করে আরও মনোযোগ সহকারে পড়ুন;)
বোজহো

4
@ ডাউনভোটার - ভুলটি আগে ছিল। আপনি যদি এখনই দেখতে পান তবে শেয়ার করুন
বোঝো

এই সমাধান কি ধীর? বা আমরা কি এটি অবাধে ব্যবহার করতে পারি?
ড্যানি ওয়াই

ঠিক আছে. তবে এটি অতিরিক্ত ব্যবহার করবেন না।
বোঝো


16

আপনার প্রয়োজনের উপর ভিত্তি করে আপনি যে কোনও একটি ব্যবহার করতে পারেন:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

উপরের তালিকা থেকে কেবলমাত্র সর্বজনীন ক্ষেত্রগুলি ফিল্টার করতে (প্রয়োজনীয়তার ভিত্তিতে) নীচের কোডটি ব্যবহার করুন:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

কিছু ব্যবহারকারীর দ্বারা উল্লিখিত হিসাবে, নীচের কোডটি একটি প্রদত্ত শ্রেণীর সমস্ত ক্ষেত্র সন্ধানে সহায়তা করতে পারে।

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

তবে আরও আকর্ষণীয় পদ্ধতির নীচে রয়েছে:

জ্যাকসন লাইব্রেরির সাহায্যে স্ট্রিং / ইন্টিজার / ডাবল টাইপের সমস্ত শ্রেণীর বৈশিষ্ট্য এবং মানচিত্র শ্রেণিতে স্বতন্ত্র মানগুলি সন্ধান করতে সক্ষম হয়েছি। ( প্রতিবিম্ব এপিআই ব্যবহার না করে! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.