how to read object attribute dynamically in java?

后端 未结 5 1180
清歌不尽
清歌不尽 2021-02-07 12:38

Is there any way to read and print the object attribute dynamically(Java) ? for example if I have following object

public class A{
  int age ;
  String name;
           


        
相关标签:
5条回答
  • 2021-02-07 12:47

    You can use reflection, but the API is not very nice to use. But what you are trying to do is not at all object-oriented. The A and B should have method "print yourself" which would output their values (you should specify the method in superclass/interface to call the method using polymorphism).

    0 讨论(0)
  • 2021-02-07 12:49

    You want to use The Reflection API. Specifically, take a look at discovering class members.

    You could do something like the following:

    public void showFields(Object o) {
       Class<?> clazz = o.getClass();
    
       for(Field field : clazz.getDeclaredFields()) {
           //you can also use .toGenericString() instead of .getName(). This will
           //give you the type information as well.
    
           System.out.println(field.getName());
       }
    }
    

    I just wanted to add a cautionary note that you normally don't need to do anything like this and for most things you probably shouldn't. Reflection can make the code hard to maintain and read. Of course there are specific cases when you would want to use Reflection, but those relatively rare.

    0 讨论(0)
  • 2021-02-07 12:50

    You can use reflection to get every field from your object (if security configuration allows you).

    If you need it not for the sake of self-education, then it may be worth using ReflectionUtils from Apache Commons.

    0 讨论(0)
  • 2021-02-07 12:55

    Using org.apache.commons.beanutils.PropertyUtils we can do this. If the proper getters and setters are defined for the bean we can also dynamically set the value:

    import org.apache.commons.beanutils.PropertyUtils;
    import java.beans.PropertyDescriptor;
    
    public class PropertyDescriptorTest {
    
        public static void main(String[] args) {
    
            // Declaring and setting values on the object
            AnyObject anObject = new AnyObject();
            anObject.setIntProperty(1);
            anObject.setLongProperty(234L);
            anObject.setStrProperty("string value");
    
            // Getting the PropertyDescriptors for the object
            PropertyDescriptor[] objDescriptors = PropertyUtils.getPropertyDescriptors(anObject);
    
            // Iterating through each of the PropertyDescriptors
            for (PropertyDescriptor objDescriptor : objDescriptors) {
                try {
                    String propertyName = objDescriptor.getName();
                    Object propType = PropertyUtils.getPropertyType(anObject, propertyName);
                    Object propValue = PropertyUtils.getProperty(anObject, propertyName);
    
                    // Printing the details
                    System.out.println("Property="+propertyName+", Type="+propType+", Value="+propValue);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    

    To set the value of a particular property:

    // Here we have to make sure the value is
    // of the same type as propertyName
    PropertyUtils.setProperty(anObject, propertyName, value);
    

    Output will be:

    Property=class, Type=class java.lang.Class, Value=class genericTester.AnyObject
    Property=intProperty, Type=int, Value=1
    Property=longProperty, Type=class java.lang.Long, Value=234
    Property=strProperty, Type=class java.lang.String, Value=string value
    
    0 讨论(0)
  • 2021-02-07 13:11

    I think I would consider a different approach.

    If you really want to treat these like data is there any reason they couldn't be hashtables (Do they have associated code)?

    Reflection will do it but it's a last resort--you should always seriously consider different approaches before dropping to reflection.

    Cases where you must access variables like that exist--like database mapping (Hibernate) and injection (Spring). You might want to consider if a packaged solution like that fits your need so that future programmers can understand what you did without learning everything about your specific solution.

    Also, Spring injection can do things that might fit your needs.

    Also also if you are going to use reflection, seriously consider annotations so that you aren't tying your functionality to what should be simple arbitrary attribute names.

    0 讨论(0)
提交回复
热议问题