JavaAPI之Introspector

2024-05-07 02:58
文章标签 java api introspector

本文主要是介绍JavaAPI之Introspector,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

结构

java.beans

类 Introspector

java.lang.Objectjava.beans.Introspector

描述

 

Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。

对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。

对于每个 "Foo" 类,如果存在相应的 "FooBeanInfo" 类,显式信息可能是可用的,查询这些信息时,FooBeanInfo 类会提供一个非 null 值。通过获得目标 bean 类的完全受限定包名称并追加 "BeanInfo" 形成一个新类,首先查找 BeanInfo 类。如果此操作失败,则采用此名称的最终类名称组件,在BeanInfo 包搜索路径中指定的每个包中搜索该类。

因此对于某个类,比如说 "sun.xyz.OurButton",首先需要查找称为 "sun.xyz.OurButtonBeanInfo" 的 BeanInfo 类,如果失败,则查找BeanInfo 搜索路径中的每个包来搜索 OurButtonBeanInfo 类。对于默认搜索路径,这意味着将查找 "sun.beans.infos.OurButtonBeanInfo"。

如果某个类提供有关其自身的显式 BeanInfo,则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。

如果没有在某个类上发现显式 BeanInfo,则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。然后深入分析类的超类,从它那里(可能在超类链的顶部)添加信息。

因为 Introspector 缓存  BeanInfo 类来获得更好的性能,所以如果在使用多个类加载器的应用程序中使用它,则需小心谨慎。通常,在破坏一个已用于 introspect 类的 ClassLoader 时,应使用 Introspector.flushCachesIntrospector.flushFromCaches 方法从缓存中清除所有内省的类。

有关内省和设计模式的更多信息,请参阅 JavaBeans specification。

字段

1、public static final int USE_ALL_BEANINFO   值为1

2、public static final intIGNORE_IMMEDIATE_BEANINFO 值为2

3、 public static final intIGNORE_ALL_BEANINFO  值为3

方法

1、public staticBeanInfogetBeanInfo(Class<?> beanClass) throwsIntrospectionException  在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。

如果 Java Bean 的 BeanInfo 类以前已经被内省,则从 BeanInfo 缓存中检索 BeanInfo 类。

参数:beanClass - 将要分析的 bean 类。

返回:描述目标 bean 的 BeanInfo 对象。

抛出:IntrospectionException - 如果在内省期间发生异常。

另请参见:flushCaches(),flushFromCaches(java.lang.Class)

2、public static BeanInfogetBeanInfo(Class<?> beanClass,  int flags) throwsIntrospectionException

在 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 - 如果在内省期间发生异常。

3、public static BeanInfogetBeanInfo(Class<?> beanClass,  Class<?> stopClass) throwsIntrospectionException

在给定的“断”点之下,在 Java Bean 上进行内省,了解其所有属性和公开的方法。

如果 Java Bean 的 BeanInfo 类以前已经基于相同的参数被内省,则从 BeanInfo 缓存中检索 BeanInfo 类。

参数:beanClass - 将要分析的 bean 类。

            stopClass - 从其所在位置开始停止分析的基类。stopClass 或其基类中的所有方法/属性/事件都将在分析中被忽略。

抛出:IntrospectionException - 如果在内省期间发生异常。

4、public static Stringdecapitalize(String name)

获得一个字符串并将它转换成普通 Java 变量名称大写形式的实用工具方法。这通常意味着将首字符从大写转换成小写,但在(不平常的)特殊情况下,当有多个字符且第一个和第二个字符都是大写字符时,不执行任何操作。

因此 "FooBah" 变成 "fooBah","X" 变成 "x",但 "URL" 仍然是 "URL"。

参数:name - 要取消大写化的字符串。

返回:取消大写化的字符串。

5、public static String[]getBeanInfoSearchPath()

获得将用来查找 BeanInfo 类的包名称的列表。

返回:为了查找 BeanInfo 类而被搜索的包名称数组。此数组的默认值与实现有关,例如 Sun 实现最初设置为 {"sun.beans.infos"}。

6、public static void setBeanInfoSearchPath(String[] path)

更改将用来查找 BeanInfo 类的包名称的列表。如果参数 path 为 null,则此方法的行为是未定义的。

如果有安全管理器,则首先调用其 checkPropertiesAccess 方法。这可能会导致 SecurityException 异常。

参数:path - 包名称数组。

抛出:SecurityException - 如果安全管理器存在并且其checkPropertiesAccess 方法不允许设置系统属性。

另请参见:SecurityManager.checkPropertiesAccess()

7、public static void flushCaches()

刷新所有 Introspector 的内部缓存。通常不需要此方法。通常只有高级工具才需要使用此方法,这些工具需要在适当的位置更新现有的 "Class" 对象,并需要使 Introspector 重新分析现有的 Class 对象。 

8、public static void flushFromCaches(Class<?> clz)

刷新给定类的 Introspector 的内部缓存信息。通常不需要此方法。通常只有高级工具才需要使用此方法,这些工具需要在适当的位置更新现有的 "Class" 对象,并需要使 Introspector 重新分析现有的 Class 对象。 注意,只刷新与目标 Class 对象有关联的直接状态。不需要刷新具有相同名称的其他 Class 对象的状态,也不需要刷新所有相关 Class 对象(比如子类)的状态,这些状态甚至可能包括间接从目标 Class 对象中获得的信息。

参数:clz - 要刷新的 Class 对象。

抛出:NullPointerException - 如果 Class 对象为 null。

这篇关于JavaAPI之Introspector的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966132

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定