|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--java.beans.Introspector
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).
Field Summary | |
private BeanInfo[] |
additionalBeanInfo
|
private Class |
beanClass
|
private static Hashtable |
beanInfoCache
|
private static Hashtable |
declaredMethodCache
|
private int |
defaultEventIndex
|
private String |
defaultEventName
|
private int |
defaultPropertyIndex
|
private String |
defaultPropertyName
|
private static Class |
eventListenerType
|
private Hashtable |
events
|
static int |
IGNORE_ALL_BEANINFO
|
static int |
IGNORE_IMMEDIATE_BEANINFO
|
private BeanInfo |
informant
|
private Hashtable |
methods
|
private Hashtable |
properties
|
private boolean |
propertyChangeSource
|
private static String[] |
searchPath
|
private BeanInfo |
superBeanInfo
|
static int |
USE_ALL_BEANINFO
|
Constructor Summary | |
private |
Introspector(Class beanClass,
Class stopClass,
int flags)
|
Method Summary | |
(package private) void |
addEvent(EventSetDescriptor esd)
|
private void |
addMethod(MethodDescriptor md)
|
(package private) void |
addProperty(PropertyDescriptor pd)
|
static String |
decapitalize(String name)
Utility method to take a string and convert it to normal Java variable name capitalization. |
private static BeanInfo |
findInformant(Class beanClass)
|
(package private) static java.lang.reflect.Method |
findMethod(Class cls,
String methodName,
int argCount)
Find a target methodName on a given class. |
static void |
flushCaches()
Flush all of the Introspector's internal caches. |
static void |
flushFromCaches(Class clz)
Flush the Introspector's internal cached information for a given class. |
private GenericBeanInfo |
getBeanInfo()
|
static BeanInfo |
getBeanInfo(Class beanClass)
Introspect on a Java bean and learn about all its properties, exposed methods, and events. |
static BeanInfo |
getBeanInfo(Class beanClass,
Class stopClass)
Introspect on a Java bean and learn all about its properties, exposed methods, below a given "stop" point. |
static BeanInfo |
getBeanInfo(Class beanClass,
int flags)
Introspect on a Java bean and learn about all its properties, exposed methods, and events, subnject to some comtrol flags. |
static String[] |
getBeanInfoSearchPath()
Gets the list of package names that will be used for finding BeanInfo classes. |
private static java.lang.reflect.Method[] |
getPublicDeclaredMethods(Class clz)
|
private BeanDescriptor |
getTargetBeanDescriptor()
|
private int |
getTargetDefaultEventIndex()
|
private int |
getTargetDefaultPropertyIndex()
|
private EventSetDescriptor[] |
getTargetEventInfo()
|
private MethodDescriptor[] |
getTargetMethodInfo()
|
private PropertyDescriptor[] |
getTargetPropertyInfo()
|
(package private) static Object |
instantiate(Class sibling,
String className)
Try to create an instance of a named class. |
private static java.lang.reflect.Method |
internalFindMethod(Class start,
String methodName,
int argCount)
Internal support for finding a target methodName on a given class. |
private boolean |
isEventHandler(java.lang.reflect.Method m)
|
(package private) static boolean |
isSubclass(Class a,
Class b)
Return true if class a is either equivalent to class b, or if class a is a subclass of class b, i.e. |
private String |
makeQualifiedMethodName(MethodDescriptor md)
|
static void |
setBeanInfoSearchPath(String[] path)
Change the list of package names that will be used for finding BeanInfo classes. |
private boolean |
throwsException(java.lang.reflect.Method method,
Class exception)
Return true iff the given method throws the given exception. |
Methods inherited from class java.lang.Object |
|
Field Detail |
public static final int USE_ALL_BEANINFO
public static final int IGNORE_IMMEDIATE_BEANINFO
public static final int IGNORE_ALL_BEANINFO
private BeanInfo informant
private boolean propertyChangeSource
private Class beanClass
private BeanInfo superBeanInfo
private BeanInfo[] additionalBeanInfo
private static Hashtable beanInfoCache
private static Class eventListenerType
private String defaultEventName
private String defaultPropertyName
private int defaultEventIndex
private int defaultPropertyIndex
private Hashtable methods
private static Hashtable declaredMethodCache
private Hashtable properties
private Hashtable events
private static String[] searchPath
Constructor Detail |
private Introspector(Class beanClass, Class stopClass, int flags) throws IntrospectionException
Method Detail |
public static BeanInfo getBeanInfo(Class beanClass) throws IntrospectionException
beanClass
- The bean class to be analyzed.public static BeanInfo getBeanInfo(Class beanClass, int flags) throws IntrospectionException
beanClass
- The bean class to be analyzed.flags
- Flags to control the introspection.
If flags == USE_ALL_BEANINFO then we use all of the BeanInfo
classes we can discover.
If flags == IGNORE_IMMEDIATE_BEANINFO then we ignore any
BeanInfo associated with the specified beanClass.
If flags == IGNORE_ALL_BEANINFO then we ignore all BeanInfo
associated with the specified beanClass or any of its
parent classes.public static BeanInfo getBeanInfo(Class beanClass, Class stopClass) throws IntrospectionException
bean
- The bean class to be analyzed.stopClass
- The baseclass at which to stop the analysis. Any
methods/properties/events in the stopClass or in its baseclasses
will be ignored in the analysis.public static String decapitalize(String name)
Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".
name
- The string to be decapitalized.public static String[] getBeanInfoSearchPath()
This is initially set to {"sun.beans.infos"}.
public static void setBeanInfoSearchPath(String[] path)
First, if there is a security manager, its checkPropertiesAccess
method is called. This could result in a SecurityException.
path
- Array of package names.checkPropertiesAccess
method doesn't allow setting
of system properties.SecurityManager.checkPropertiesAccess()
public static void flushCaches()
public static void flushFromCaches(Class clz)
clz
- Class object to be flushed.private GenericBeanInfo getBeanInfo() throws IntrospectionException
private static BeanInfo findInformant(Class beanClass)
private PropertyDescriptor[] getTargetPropertyInfo() throws IntrospectionException
void addProperty(PropertyDescriptor pd)
private EventSetDescriptor[] getTargetEventInfo() throws IntrospectionException
void addEvent(EventSetDescriptor esd)
private MethodDescriptor[] getTargetMethodInfo() throws IntrospectionException
private void addMethod(MethodDescriptor md)
private String makeQualifiedMethodName(MethodDescriptor md)
private int getTargetDefaultEventIndex()
private int getTargetDefaultPropertyIndex()
private BeanDescriptor getTargetBeanDescriptor() throws IntrospectionException
private boolean isEventHandler(java.lang.reflect.Method m) throws IntrospectionException
private static java.lang.reflect.Method[] getPublicDeclaredMethods(Class clz)
private static java.lang.reflect.Method internalFindMethod(Class start, String methodName, int argCount)
static java.lang.reflect.Method findMethod(Class cls, String methodName, int argCount) throws IntrospectionException
static boolean isSubclass(Class a, Class b)
private boolean throwsException(java.lang.reflect.Method method, Class exception)
static Object instantiate(Class sibling, String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |