Often you might like to get access to information about a DynamicBean that has not yet been instantiated. For instance, you might have a DynamicBean based on JDBC ResultSets. You want to know what properties a ResultSet for some query might have. Using the above techniques, there is no way to do this; where would the DynamicBeanInfo come from?

You might have a Query class or interface, which describes a query that generates a ResultSet when executed. It would be nice to have a way to get a DynamicBeanInfo from the Query without executing it. We’d like to use the Query (apart from its other functions) as a dynamic type: it can provide information about the dynamic beans that it is capable of generating.

Dynamic beans provides an interface called DynamicBeanTyper. It contains a single method:

public DynamicBeanInfo getBeanInfoFromType(Object pDescription)
        throws IntrospectionException;

The purpose of this method is to return a DynamicBeanInfo from an object (such as the imagined Query) that plays the role of a dynamic type. You register a DynamicBeanTyper by calling DynamicBeans.registerBeanTyper(Class, DynamicBeanTyper). The class parameter is the class of a dynamic type, not the class of a DynamicBean. In this example, it is Query.class.

After the example DynamicBeanTyper is registered, the static method DynamicBeans.getBeanInfoFromType(Object) can be used to obtain a DynamicBeanInfo for any Query.

One final, useful twist: instances of java.lang.Class—that is, static types—act as dynamic types. In other words, there is a DynamicBeanTyper registered for Class.class. Its function is to return a DynamicBeanInfo that describes an instance of the given class, as analyzed by JavaBeans introspection. You might, for instance, call DynamicBeans.getBeanInfoFromType(Date.class), and the result is a DynamicBeanInfo describing an instance of Date. This is the same result you get by calling DynamicBeans.getBeanInfo() on an instance of Date.