public class Introspector extends Object
对于这三种信息中的每一种,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™ specification 。
Modifier and Type | Field and Description |
---|---|
static int |
IGNORE_ALL_BEANINFO
标记以表示忽略所有beaninfo。
|
static int |
IGNORE_IMMEDIATE_BEANINFO
标记表示忽略直接beaninfo。
|
static int |
USE_ALL_BEANINFO
用来表示使用所有beaninfo的标志。
|
Modifier and Type | Method and Description |
---|---|
static String |
decapitalize(String name)
实用方法来取一个字符串并将其转换为正常的Java变量名称大小写。
|
static void |
flushCaches()
冲洗所有Introspector的内部缓存。
|
static void |
flushFromCaches(类<?> clz)
刷新内部缓存信息给一个给定的类。
|
static BeanInfo |
getBeanInfo(类<?> beanClass)
内省Java Bean并了解其所有属性,暴露的方法和事件。
|
static BeanInfo |
getBeanInfo(类<?> beanClass, 类<?> stopClass)
内省Java bean并了解其属性,暴露的方法,低于给定的“停止”点。
|
static BeanInfo |
getBeanInfo(类<?> beanClass, 类<?> stopClass, int flags)
对Java Bean进行内省,并了解其所有属性,暴露的方法和事件,低于给定的
stopClass 点,受到一些控制
flags 。
|
static BeanInfo |
getBeanInfo(类<?> beanClass, int flags)
对Java bean进行内省,并了解其所有属性,公开方法和事件,并遵守一些控制标志。
|
static String[] |
getBeanInfoSearchPath()
获取将用于查找BeanInfo类的包名称列表。
|
static void |
setBeanInfoSearchPath(String[] path)
更改将用于查找BeanInfo类的包名称列表。
|
public static final int USE_ALL_BEANINFO
public static final int IGNORE_IMMEDIATE_BEANINFO
public static final int IGNORE_ALL_BEANINFO
public static BeanInfo getBeanInfo(类<?> beanClass) throws IntrospectionException
如果Java Bean的BeanInfo类之前已经被Introspected,那么BeanInfo类将从BeanInfo缓存中检索。
beanClass
- 要分析的bean类。
IntrospectionException
- 如果在内省期间发生异常。
flushCaches()
,
flushFromCaches(java.lang.Class<?>)
public static BeanInfo getBeanInfo(类<?> beanClass, int flags) throws IntrospectionException
如果Java Bean的BeanInfo类之前已经基于相同的参数进行了Introspected,那么BeanInfo类将从BeanInfo缓存中检索。
beanClass
- 要分析的bean类。
flags
- 控制内省的标志。
如果flags == USE_ALL_BEANINFO,那么我们使用我们可以发现的所有BeanInfo类。
如果flags == IGNORE_IMMEDIATE_BEANINFO,那么我们忽略与指定的beanClass关联的任何BeanInfo。
如果flags == IGNORE_ALL_BEANINFO,那么我们忽略与指定的beanClass或其任何父类相关联的所有BeanInfo。
IntrospectionException
- 如果在内省时发生异常。
public static BeanInfo getBeanInfo(类<?> beanClass, 类<?> stopClass) throws IntrospectionException
如果Java Bean的BeanInfo类之前已经基于相同的参数进行了Introspected,那么BeanInfo类将从BeanInfo缓存中检索。
beanClass
- 要分析的bean类。
stopClass
- 停止分析的基础。
在分析中将忽略stopClass或其基类中的任何方法/属性/事件。
IntrospectionException
- 如果在内省期间发生异常。
public static BeanInfo getBeanInfo(类<?> beanClass, 类<?> stopClass, int flags) throws IntrospectionException
stopClass
点,受到一些控制flags
。
beanClass
任何BeanInfo将被忽略。
beanClass
或其任何父类相关beanClass
任何BeanInfo将被忽略。
stopClass
或其父类中的任何方法/属性/事件。
如果Java Bean的BeanInfo类先前已经基于相同的参数进行内省,那么BeanInfo类将从BeanInfo缓存中检索。
beanClass
- 要分析的bean类
stopClass
- 停止分析的父类
flags
- 控制内省的标志
IntrospectionException
- 如果在内省期间发生异常
public static String decapitalize(String name)
因此,“FooBah”变为“fooBah”,“X”变成“x”,但是“URL”保持为“URL”。
name
- 要脱硬的字符串。
public static String[] getBeanInfoSearchPath()
public static void setBeanInfoSearchPath(String[] path)
首先,如果有安全管理员,则调用其checkPropertiesAccess
方法。 这可能会导致SecurityException。
path
- 包名称数组。
SecurityException
- 如果存在安全管理员,并且其
checkPropertiesAccess
方法不允许设置系统属性。
SecurityManager.checkPropertiesAccess()
public static void flushCaches()
public static void flushFromCaches(类<?> clz)
clz
- 要刷新的类对象。
NullPointerException
- 如果Class对象为空。