对于这三种信息中的每一种,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描述static final int
标志以指示忽略所有 beaninfo。static final int
指示忽略立即 beaninfo 的标志。static final int
指示使用所有 beaninfo 的标志。 -
方法总结
修饰符和类型方法描述static String
decapitalize
(String name) 获取字符串并将其转换为普通 Java 变量名大写的实用方法。static void
刷新 Introspector 的所有内部缓存。static void
flushFromCaches
(Class<?> clz) 刷新给定类的内省器的内部缓存信息。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 类的包名称列表。
-
字段详细信息
-
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
- 参见:
-
-
方法详情
-
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
- 停止分析的基类。分析中将忽略 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 类的包名称列表。如果参数路径为空,则此方法的行为未定义。首先,如果有安全管理器,则调用其
checkPropertiesAccess
方法。这可能会导致 SecurityException。- 参数:
path
- 包名称数组。- 抛出:
SecurityException
- 如果安全管理器存在且其checkPropertiesAccess
方法不允许设置系统属性。- 参见:
-
flushCaches
public static void flushCaches()刷新 Introspector 的所有内部缓存。通常不需要此方法。它通常只被更新现有“类”对象的高级工具需要,并且需要使内省器重新分析现有类对象。- 自从:
- 1.2
-
flushFromCaches
刷新给定类的内省器的内部缓存信息。通常不需要此方法。它通常只被更新现有“类”对象的高级工具需要,并且需要使内省器重新分析现有类对象。请注意,只有与目标类对象关联的直接状态会被刷新。我们不会刷新其他具有相同名称的 Class 对象的状态,也不会刷新任何相关 Class 对象(例如子类)的状态,即使它们的状态可能包含从目标 Class 对象间接获得的信息。- 参数:
clz
- 要刷新的类对象。- 抛出:
NullPointerException
- 如果 Class 对象为 null。- 自从:
- 1.2
-