Module java.desktop
Package java.beans

Class Introspector

java.lang.Object
java.beans.Introspector

public class Introspector extends Object
Introspector类提供了一个标准的方式,供工具了解目标Java Bean支持的属性、事件和方法。

对于这三种信息中的每一种,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 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

      public static BeanInfo getBeanInfo(Class<?> beanClass) throws IntrospectionException
      内省Java Bean并了解其所有属性、公开方法和事件。

      如果Java Bean的BeanInfo类之前已经进行了内省,则将从BeanInfo缓存中检索BeanInfo类。

      参数:
      beanClass - 要分析的bean类。
      返回:
      描述目标bean的BeanInfo对象。
      抛出:
      IntrospectionException - 如果在内省过程中发生异常。
      另请参见:
    • getBeanInfo

      public static BeanInfo getBeanInfo(Class<?> beanClass, int flags) throws IntrospectionException
      内省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

      public static String decapitalize(String name)
      将字符串转换为普通Java变量名称大写形式的实用方法。通常意味着将第一个字符从大写转换为小写,但在(不寻常的)特殊情况下,如果有多个字符且第一个和第二个字符都是大写,则保持不变。

      因此,“FooBah”变为“fooBah”,“X”变为“x”,但“URL”保持为“URL”。

      参数:
      name - 要小写化的字符串。
      返回:
      字符串的小写化版本。
    • getBeanInfoSearchPath

      public static String[] getBeanInfoSearchPath()
      获取用于查找BeanInfo类的包名称列表。
      返回:
      将用于按顺序查找BeanInfo类的包名称数组。此数组的默认值取决于实现;例如,Sun实现最初设置为{"sun.beans.infos"}。
    • setBeanInfoSearchPath

      public static void setBeanInfoSearchPath(String[] path)
      更改用于查找BeanInfo类的包名称列表。如果参数路径为null,则此方法的行为未定义。

      首先,如果存在安全管理器,则将调用其checkPropertiesAccess方法。这可能导致SecurityException。

      参数:
      path - 包名称数组。
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertiesAccess方法不允许设置系统属性。
      另请参见:
    • flushCaches

      public static void flushCaches()
      清除Introspector的所有内部缓存。通常不需要此方法。通常只有高级工具需要在原地更新现有“Class”对象并需要使Introspector重新分析现有Class对象时才需要。
      自版本:
      1.2
    • flushFromCaches

      public static void flushFromCaches(Class<?> clz)
      清除给定类的内部缓存信息。通常情况下不需要使用此方法。通常只有高级工具才需要使用,这些工具会就地更新现有的“Class”对象,并需要使内省器重新分析现有的Class对象。请注意,只有与目标Class对象关联的直接状态会被清除。我们不会清除其他具有相同名称的Class对象的状态,也不会清除任何相关的Class对象的状态(例如子类),即使它们的状态可能间接地从目标Class对象获取信息。
      参数:
      clz - 要清除的Class对象。
      抛出:
      NullPointerException - 如果Class对象为null。
      自版本:
      1.2