对于这三种信息中的每一种,Introspector将分别分析bean的类和超类,寻找显式或隐式信息,并使用该信息构建一个全面描述目标bean的BeanInfo对象。
对于每个类“Foo”,如果存在一个提供信息的对应“FooBeanInfo”类,当查询该信息时会提供一个非空值。我们首先通过取目标bean类的完整包限定名称并附加“BeanInfo”来形成一个新的类名来查找BeanInfo类。如果这种方法失败,那么我们取这个名称的最后一个类名组件,并在BeanInfo包搜索路径中的每个包中查找该类。
因此,对于类似“sun.xyz.OurButton”的类,我们首先会查找一个名为“sun.xyz.OurButtonBeanInfo”的BeanInfo类,如果失败,我们会在BeanInfo搜索路径中的每个包中查找一个OurButtonBeanInfo类。使用默认搜索路径,这意味着查找“sun.beans.infos.OurButtonBeanInfo”。
如果一个类提供了关于自身的显式BeanInfo,那么我们将将其添加到从分析任何派生类获得的BeanInfo信息中,但我们将显式信息视为当前类及其基类的权威信息,并不会进一步沿着超类链进行。
如果我们在一个类上找不到显式BeanInfo,我们将使用低级反射来研究类的方法,并应用标准设计模式来识别属性访问器、事件源或公共方法。然后我们继续分析类的超类并添加其信息(可能一直到超类链的顶部)。
有关内省和设计模式的更多信息,请参阅JavaBeans规范。
- 自版本:
- 1.1
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
用于指示忽略所有beaninfo的标志。static final int
用于指示忽略立即beaninfo的标志。static final int
用于指示使用所有beaninfo的标志。 -
Method Summary
Modifier and TypeMethodDescriptionstatic String
decapitalize
(String name) 将字符串转换为普通Java变量名称大写形式的实用方法。static void
清除Introspector的所有内部缓存。static void
flushFromCaches
(Class<?> clz) 清除给定类的Introspector的内部缓存信息。static BeanInfo
getBeanInfo
(Class<?> beanClass) 内省Java Bean并了解其所有属性、公开方法和事件。static BeanInfo
getBeanInfo
(Class<?> beanClass, int flags) 内省Java Bean并了解其所有属性、公开方法和事件,受一些控制标志的限制。static BeanInfo
getBeanInfo
(Class<?> beanClass, Class<?> stopClass) 内省Java Bean并了解其所有属性、公开方法,直到给定的“停止”点。static BeanInfo
getBeanInfo
(Class<?> beanClass, Class<?> stopClass, int flags) 内省Java Bean并了解其所有属性、公开方法和事件,直到给定stopClass
点,受一些控制flags
的限制。static String[]
获取用于查找BeanInfo类的包名称列表。static void
setBeanInfoSearchPath
(String[] path) 更改用于查找BeanInfo类的包名称列表。
-
Field Details
-
USE_ALL_BEANINFO
public static final int USE_ALL_BEANINFO用于指示使用所有beaninfo的标志。- 自版本:
- 1.2
- 另请参见:
-
IGNORE_IMMEDIATE_BEANINFO
public static final int IGNORE_IMMEDIATE_BEANINFO用于指示忽略立即beaninfo的标志。- 自版本:
- 1.2
- 另请参见:
-
IGNORE_ALL_BEANINFO
public static final int IGNORE_ALL_BEANINFO用于指示忽略所有beaninfo的标志。- 自版本:
- 1.2
- 另请参见:
-
-
Method Details
-
getBeanInfo
内省Java Bean并了解其所有属性、公开方法和事件。如果Java Bean的BeanInfo类之前已经进行了内省,则将从BeanInfo缓存中检索BeanInfo类。
- 参数:
-
beanClass
- 要分析的bean类。 - 返回:
- 描述目标bean的BeanInfo对象。
- 抛出:
-
IntrospectionException
- 如果在内省过程中发生异常。 - 另请参见:
-
getBeanInfo
内省Java Bean并了解其所有属性、公开方法和事件,受一些控制标志的限制。如果Java Bean的BeanInfo类基于相同参数之前已经进行了内省,则将从BeanInfo缓存中检索BeanInfo类。
- 参数:
-
beanClass
- 要分析的bean类。 -
flags
- 用于控制内省的标志。如果flags == USE_ALL_BEANINFO,则使用所有可以发现的BeanInfo类。如果flags == IGNORE_IMMEDIATE_BEANINFO,则忽略与指定beanClass关联的任何BeanInfo。如果flags == IGNORE_ALL_BEANINFO,则忽略与指定beanClass或其任何父类关联的所有BeanInfo。 - 返回:
- 描述目标bean的BeanInfo对象。
- 抛出:
-
IntrospectionException
- 如果在内省过程中发生异常。 - 自版本:
- 1.2
-
getBeanInfo
public static BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass) throws IntrospectionException 内省Java Bean并了解其所有属性、公开方法,直到给定的“停止”点。如果Java Bean的BeanInfo类基于相同参数之前已经进行了内省,则将从BeanInfo缓存中检索BeanInfo类。
- 参数:
-
beanClass
- 要分析的bean类。 -
stopClass
- 要停止分析的基类。在分析中将忽略停止类或其基类中的任何方法/属性/事件。 - 返回:
- bean的BeanInfo。
- 抛出:
-
IntrospectionException
- 如果在内省过程中发生异常。
-
getBeanInfo
public static BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass, int flags) throws IntrospectionException 内省Java Bean并了解其所有属性、公开方法和事件,直到给定stopClass
点,受一些控制flags
的限制。- USE_ALL_BEANINFO
- 将使用任何可以发现的BeanInfo。
- IGNORE_IMMEDIATE_BEANINFO
-
将忽略与指定
beanClass
关联的任何BeanInfo。 - IGNORE_ALL_BEANINFO
-
将忽略与指定
beanClass
或其任何父类关联的任何BeanInfo。
stopClass
或其父类中的任何方法/属性/事件。如果Java Bean的BeanInfo类基于相同参数之前已经进行了内省,则将从BeanInfo缓存中检索BeanInfo类。
- 参数:
-
beanClass
- 要分析的bean类 -
stopClass
- 要停止分析的父类 -
flags
- 用于控制内省的标志 - 返回:
- 描述目标bean的BeanInfo对象
- 抛出:
-
IntrospectionException
- 如果在内省过程中发生异常 - 自版本:
- 1.7
-
decapitalize
将字符串转换为普通Java变量名称大写形式的实用方法。通常意味着将第一个字符从大写转换为小写,但在(不寻常的)特殊情况下,如果有多个字符且第一个和第二个字符都是大写,则保持不变。因此,“FooBah”变为“fooBah”,“X”变为“x”,但“URL”保持为“URL”。
- 参数:
-
name
- 要小写化的字符串。 - 返回:
- 字符串的小写化版本。
-
getBeanInfoSearchPath
获取用于查找BeanInfo类的包名称列表。- 返回:
- 将用于按顺序查找BeanInfo类的包名称数组。此数组的默认值取决于实现;例如,Sun实现最初设置为{"sun.beans.infos"}。
-
setBeanInfoSearchPath
更改用于查找BeanInfo类的包名称列表。如果参数路径为null,则此方法的行为未定义。首先,如果存在安全管理器,则将调用其
checkPropertiesAccess
方法。这可能导致SecurityException。- 参数:
-
path
- 包名称数组。 - 抛出:
-
SecurityException
- 如果存在安全管理器且其checkPropertiesAccess
方法不允许设置系统属性。 - 另请参见:
-
flushCaches
public static void flushCaches()清除Introspector的所有内部缓存。通常不需要此方法。通常只有高级工具需要在原地更新现有“Class”对象并需要使Introspector重新分析现有Class对象时才需要。- 自版本:
- 1.2
-
flushFromCaches
清除给定类的内部缓存信息。通常情况下不需要使用此方法。通常只有高级工具才需要使用,这些工具会就地更新现有的“Class”对象,并需要使内省器重新分析现有的Class对象。请注意,只有与目标Class对象关联的直接状态会被清除。我们不会清除其他具有相同名称的Class对象的状态,也不会清除任何相关的Class对象的状态(例如子类),即使它们的状态可能间接地从目标Class对象获取信息。- 参数:
-
clz
- 要清除的Class对象。 - 抛出:
-
NullPointerException
- 如果Class对象为null。 - 自版本:
- 1.2
-