Close

Spring - Obtaining BeanInfo And PropertyDescriptors

[Last Updated: Dec 22, 2023]

The interface org.springframework.beans.BeanInfoFactory is an alternative to java.beans.Introspector to create a Spring specific enhanced implementation of java.beans.BeanInfo. BeanInfoFactory has only one method

BeanInfo getBeanInfo(Class<?> beanClass)

BeanInfoFactory implementation, org.springframework.beans.ExtendedBeanInfoFactory, accepts JavaBeans "non-standard" setter methods as 'writable' which returns some values instead of void.

This is the description from org.springframework.beans.ExtendedBeanInfo. This is a package private class which is a wrapper around standard java.beans.BeanInfo:

Wrap the given BeanInfo instance; copy all its existing property descriptors locally, wrapping each in a custom indexed or non-indexed PropertyDescriptor variant that bypasses default JDK weak/soft reference management; then search through its method descriptors to find any non-void returning write methods and update or create the corresponding PropertyDescriptor for each one found.

Spring also provides provides following methods to obtain instances of PropertyDescriptor (these instances are obtained via org.springframework.beans.ExtendedBeanInfo):

BeanWrapper methods:

PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException;
PropertyDescriptor[] getPropertyDescriptors();

BeanUtil methods

public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName) throws BeansException
public static PropertyDescriptor findPropertyForMethod(Method method)

Example

Bean

package com.logicbig.example;

public class Person {
  private String name;

  public String getName() {
      return name;
  }

  public String setName(String name) {
      this.name = name;
      return name;
  }
}

Using BeanInfoFactory

package com.logicbig.example;

import org.springframework.beans.BeanInfoFactory;
import org.springframework.beans.ExtendedBeanInfoFactory;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class BeanInfoFactoryExample {
    public static void main (String[] args) throws IntrospectionException {
        System.out.println("-------- using JDK Introspector --");
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
        printPropertyDescriptor(beanInfo.getPropertyDescriptors());

        System.out.println("-------- using Spring BeanInfoFactory --");
        BeanInfoFactory factory = new ExtendedBeanInfoFactory();
        BeanInfo springBeanInfo = factory.getBeanInfo(Person.class);
        printPropertyDescriptor(springBeanInfo.getPropertyDescriptors());
    }

    private static void printPropertyDescriptor(PropertyDescriptor[] descriptors) {
        for (PropertyDescriptor descriptor : descriptors) {
            System.out.println("Name: "+descriptor.getName());
            System.out.println("Reader: "+descriptor.getReadMethod());
            System.out.println("Writer: "+descriptor.getWriteMethod());
            System.out.println("------");
        }
    }
}

Output

-------- using JDK Introspector --
Name: class
Reader: public final native java.lang.Class java.lang.Object.getClass()
Writer: null
------
Name: name
Reader: public java.lang.String com.logicbig.example.Person.getName()
Writer: null
------
-------- using Spring BeanInfoFactory --
Name: class
Reader: public final native java.lang.Class java.lang.Object.getClass()
Writer: null
------
Name: name
Reader: public java.lang.String com.logicbig.example.Person.getName()
Writer: public java.lang.String com.logicbig.example.Person.setName(java.lang.String)
------

Using BeanWrapper#getPropertyDescriptors()

package com.logicbig.example;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;

public class BeanWrapperPropertyDescriptorExample {
    public static void main (String[] args) {
        BeanWrapper bw = new BeanWrapperImpl(new Person());
           printPropertyDescriptor(bw.getPropertyDescriptors());
    }

    private static void printPropertyDescriptor(PropertyDescriptor[] descriptors) {
        for (PropertyDescriptor descriptor : descriptors) {
            System.out.println("Name: "+descriptor.getName());
            System.out.println("Reader: "+descriptor.getReadMethod());
            System.out.println("Writer: "+descriptor.getWriteMethod());
            System.out.println("------");
        }
    }
}

Output

Name: class
Reader: public final native java.lang.Class java.lang.Object.getClass()
Writer: null
------
Name: name
Reader: public java.lang.String com.logicbig.example.Person.getName()
Writer: public java.lang.String com.logicbig.example.Person.setName(java.lang.String)
------

Using BeanUtils#getPropertyDescriptors()

package com.logicbig.example;

import org.springframework.beans.BeanUtils;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class BeanUtilPropDescriptorExample {
    public static void main (String[] args) throws IntrospectionException {
        PropertyDescriptor[] javaDescriptor = Introspector.getBeanInfo(Person.class)
                                                  .getPropertyDescriptors();
        System.out.println("-- jdk property descriptor --");
        printPropertyDescriptor(javaDescriptor);
        PropertyDescriptor[] springDescriptor = BeanUtils.getPropertyDescriptors(Person.class);
        System.out.println("-- spring property descriptor --");
        printPropertyDescriptor(springDescriptor);

    }

    private static void printPropertyDescriptor(PropertyDescriptor[] descriptors) {
        for (PropertyDescriptor descriptor : descriptors) {
            System.out.println("Name: "+descriptor.getName());
            System.out.println("Reader: "+descriptor.getReadMethod());
            System.out.println("Writer: "+descriptor.getWriteMethod());
            System.out.println("------");
        }
    }
}

Output

-- jdk property descriptor --
Name: class
Reader: public final native java.lang.Class java.lang.Object.getClass()
Writer: null
------
Name: name
Reader: public java.lang.String com.logicbig.example.Person.getName()
Writer: null
------
-- spring property descriptor --
Name: class
Reader: public final native java.lang.Class java.lang.Object.getClass()
Writer: null
------
Name: name
Reader: public java.lang.String com.logicbig.example.Person.getName()
Writer: public java.lang.String com.logicbig.example.Person.setName(java.lang.String)
------

Example Project

Dependencies and Technologies Used:

  • spring-context 6.1.2 (Spring Context)
     Version Compatibility: 3.2.3.RELEASE - 6.1.2Version List
    ×

    Version compatibilities of spring-context with this example:

    • 3.2.3.RELEASE
    • 3.2.4.RELEASE
    • 3.2.5.RELEASE
    • 3.2.6.RELEASE
    • 3.2.7.RELEASE
    • 3.2.8.RELEASE
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.1.0
    • 6.1.1
    • 6.1.2

    Versions in green have been tested.

  • JDK 17
  • Maven 3.8.1

Spring - Obtaining BeanInfo And PropertyDescriptor Select All Download
  • spring-bean-info-and-property-descriptor
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • BeanInfoFactoryExample.java

    See Also