The Introspector class provides a standard way for tools to learn about
the properties, events, and methods supported by a target Java Bean.
For each of those three kinds of information, the Introspector will
separately analyze the bean's class and superclasses looking for
either explicit or implicit information and use that information to
build a BeanInfo object that comprehensively describes the target bean.
For each class "Foo", explicit information may be available if there exists
a corresponding "FooBeanInfo" class that provides a non-null value when
queried for the information. We first look for the BeanInfo class by
taking the full package-qualified name of the target bean class and
appending "BeanInfo" to form a new class name. If this fails, then
we take the final classname component of this name, and look for that
class in each of the packages specified in the BeanInfo package search
path.
Thus for a class such as "sun.xyz.OurButton" we would first look for a
BeanInfo class called "sun.xyz.OurButtonBeanInfo" and if that failed we'd
look in each package in the BeanInfo search path for an OurButtonBeanInfo
class. With the default search path, this would mean looking for
"sun.beans.infos.OurButtonBeanInfo".
If a class provides explicit BeanInfo about itself then we add that to
the BeanInfo information we obtained from analyzing any derived classes,
but we regard the explicit information as being definitive for the current
class and its base classes, and do not proceed any further up the superclass
chain.
If we don't find explicit BeanInfo on a class, we use low-level
reflection to study the methods of the class and apply standard design
patterns to identify property accessors, event sources, or public
methods. We then proceed to analyze the class's superclass and add
in the information from it (and possibly on up the superclass chain).
Because the Introspector caches BeanInfo classes for better performance,
take care if you use it in an application that uses
multiple class loaders.
In general, when you destroy a ClassLoader
that has been used to introspect classes,
you should use the
Introspector.flushCaches
or
Introspector.flushFromCaches
method
to flush all of the introspected classes out of the cache.
For more information about introspection and design patterns, please
consult the
JavaBeans specification.