আমার একটি ক্লাস রয়েছে এবং আমি এর সর্বজনীন ক্ষেত্রগুলি (পদ্ধতি নয়) সন্ধান করতে চাই। কিভাবে আমি এটি করতে পারব?
ধন্যবাদ!
উত্তর:
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
প্যাকেজটি একবার দেখে নিতে পারেন ।
https://docs.oracle.com/javase/tutorial/reflect/class/classMeumber.html এও লোকেশন পদ্ধতি এবং কনস্ট্রাক্টরগুলির জন্য চার্ট রয়েছে।
আপনার প্রয়োজনের উপর ভিত্তি করে আপনি যে কোনও একটি ব্যবহার করতে পারেন:
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());
কিছু ব্যবহারকারীর দ্বারা উল্লিখিত হিসাবে, নীচের কোডটি একটি প্রদত্ত শ্রেণীর সমস্ত ক্ষেত্র সন্ধানে সহায়তা করতে পারে।
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());
}
}