对象 @Test public void demo(){ //调用Introspector中的getBeanInfo()方法,传入要获取信息的类的Class对象 BeanInfo beanInfo = Introspector.getBeanInfo(Person.class); } 上面的beanInfo就是Person类的完整信息。 beanInfo = Introspector.getBeanInfo(Person.class); /*********************分割线******************** ********/ //获取方法描述器 MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors( BeanInfo beanInfo = Introspector.getBeanInfo(person.getClass()); //获取属性描述器 PropertyDescriptor
若需要在类运行时动态的获取类的信息,则需要用到反射 内省 内省是通过反射来实现的,用BeanInfo来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性,其包括的主要类有:Introspector 、BeanInfo、PropertyDescriptor 2. InvocationTargetException { // Introspector有方法来了解目标Java Bean支持的属性,事件和方法 // BeanInfo ,参数表示去除父类Object的方法,只保存User内部的方法 BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class ); // beanInfo内部有方法获取PropertyDescriptor PropertyDescriptor[] propertys = beanInfo.getPropertyDescriptors
信息 try { BeanInfo beanInfo = Introspector.getBeanInfo(Person.class); // 获得所有JavaBean的属性描述器 //每一个属性描述器代表 JavaBean的一个属性 PropertyDescriptor[] propertyDescriptors = beanInfo .getPropertyDescriptors(); 信息 try { BeanInfo beanInfo = Introspector.getBeanInfo(Person.class); // 获得所有JavaBean的属性描述器 //每一个属性描述器代表 JavaBean的一个属性 PropertyDescriptor[] propertyDescriptors = beanInfo .getPropertyDescriptors(); beanInfo = Introspector.getBeanInfo(obj.getClass()); // 通过beanInfo获得所有属性 PropertyDescriptor[] propertyDescriptors
* 如果某个类提供有关其自身的显式 BeanInfo, * 则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。 * 如果没有在某个类上发现显式 BeanInfo, * 则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。 > beanClass) throws IntrospectionException{} } /** * BeanInfo * 希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类, * 该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。 beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors
一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 readMethod.invoke(user, null); System.out.println("名字:" + invoke); } } 通过Introspector类获得Bean对象的 BeanInfo ,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法 public static void demo2() throws Exception { // 获取整个Bean的信息 // BeanInfo beanInfo= Introspector.getBeanInfo (user.getClass()); // 在Object类时候停止检索,可以选择在任意一个父类停止 BeanInfo beanInfo = Introspector.getBeanInfo
Map<String, Object> fieldMap =new HashMap<String, Object>(); BeanInfo beanInfo = Introspector.getBeanInfo (【javabean类名】.class, Object.class); //获取所有的属性描述器 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors
之后,程序又对环境中的忽略信息配置项“spring.beaninfo.ignore”的值进行获取判断,进而设置为系统参数中的忽略项。 private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) { //如果系统参数中 spring. beaninfo IGNORE_ BEANINFO_ PROPERTY_ NAME) == null) { //获取环境中 spring. beaninfo. ignore 的配置 Boolean ignore = environment . getProperty("spring . beaninfo. ignore", Boolean. class, Boolean.TRUE); //设置对应的系统参数 System. setProperty IGNORE_ BEANINFO_ PROPERTY NAME, ignore.toString()); } spring.beaninfo.ignore 的配置用来决定是否跳过 BeanInfo 类的扫描
通俗的说,就是可以通过Introspector构建一个BeanInfo对象,而这个BeanInfo对象中包含了目标类中的属性、方法和事件的描述信息,然后可以使用这个BeanInfo对象对目标对象进行相关操作 结果输出:Student{name='张三'} 通过查看Introspector.getBeanInfo方法的源码会发现,Introspector在构建一个BeanInfo对象的时候,会将构建的BeanInfo 通过上的代码可以得出,Introspector间接持有了BeanInfo的强引用。如果使用Introspector操作了很多类,那么Introspector将间接持有这些BeanInfo的强引用。 在发生垃圾收集的时候,检测到这些BeanInfo存在引用链,则这些类和对应的类加载器将不会被垃圾收集器回收,进而导致内存泄漏。
null) return null; Object obj = beanClass.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors
Introspector是一个专门处理JavaBean的工具类,用来获取JavaBean里描述符号,常用的JavaBean的描述符号相关类有BeanInfo、PropertyDescriptor,MethodDescriptor Introspector Introspector类似于BeanInfo的静态工厂类,主要是提供静态方法通过Class实例获取到BeanInfo,得到BeanInfo之后,就能够获取到其他描述符。 主要方法: public static BeanInfo getBeanInfo(Class<?> beanClass):通过Class实例获取到BeanInfo实例。 BeanInfo BeanInfo是一个接口,具体实现是GenericBeanInfo,通过这个接口可以获取一个类的各种类型的描述符。 beanInfo = Introspector.getBeanInfo(Person.class); PropertyDescriptor[] propertyDescriptors
Introspector是一个专门处理JavaBean的工具类,用来获取JavaBean里描述符号,常用的JavaBean的描述符号相关类有BeanInfo、PropertyDescriptor,MethodDescriptor JavaBean的信息在Introspector里对应的概念是BeanInfo,它包含了JavaBean所有的Descriptor(描述符),主要有PropertyDescriptor,MethodDescriptor IntrospectorIntrospector类似于BeanInfo的静态工厂类,主要是提供静态方法通过Class实例获取到BeanInfo,得到BeanInfo之后,就能够获取到其他描述符。 主要方法:public static BeanInfo getBeanInfo(Class<?> beanClass):通过Class实例获取到BeanInfo实例。 beanInfo = Introspector.getBeanInfo(Person.class); PropertyDescriptor[] propertyDescriptors =
if (map == null) return null; Object obj = beanClass.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors
在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息。 getPropertyDescriptors(),获得属性的描述,可以采用遍历BeanInfo的方法,来查找、设置类的属性。 具体代码如下: package com.niocoder.test.introspector; import java.beans.BeanInfo; import java.beans.Introspector beanInfo = Introspector.getBeanInfo(UserInfo.class); PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors beanInfo = Introspector.getBeanInfo(UserInfo.class); PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors
2.1 内省之获取BeanInfo 我们这里不想去对JavaBean规范做过多的介绍,所以也就不在多介绍BeanInfo的“出身”了。你只需要知道如何得到它,以及BeanInfo有什么。 通过java.beans.Introspector的getBeanInfo()方法来获取java.beans.BeanInfo实例。 BeanInfo beanInfo = Introspector.getBeanInfo(User.class); 2.2 得到所有属性描述符(PropertyDescriptor) 通过BeanInfo PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 每个PropertyDescriptor对象对应一个JavaBean属性: beanInfo = Introspector.getBeanInfo(User.class);[崔1] PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors
2.1、内省之获取BeanInfo 我们这里不想去对JavaBean规范做过多的介绍,所以也就不在多介绍BeanInfo的“出身”了。你只需要知道如何得到它,以及BeanInfo有什么。 通过java.beans.Introspector的getBeanInfo()方法来获取java.beans.BeanInfo实例。 BeanInfo beanInfo = Introspector.getBeanInfo(User.class); 2.2、得到所有属性描述符(PropertyDescriptor) 通过BeanInfo PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 每个PropertyDescriptor对象对应一个JavaBean属性: l beanInfo = Introspector.getBeanInfo(User.class); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors
,Object> result = new HashMap<String,Object>(); try { //获得Bean描述 BeanInfo beanInfo=Introspector.getBeanInfo(bean.getClass()); //获得属性描述 PropertyDescriptor[] descriptors =beanInfo.getPropertyDescrip //遍历所有属性 for(PropertyDescriptor des : descriptors){ beanInfo = Introspector.getBeanInfo(bean.getClass()); //获得属性描述 PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors //遍历所有属性 for(PropertyDescriptor des:descriptors){
实例代码如下: package com.peidasoft.instrospector; import java.beans.BeanInfo; import java.beans.Introspector 在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息。 getPropertyDescriptors(),获得属性的描述,可以采用遍历BeanInfo的方法,来查找、设置类的属性。 = beanInfo.getPropertyDescriptors(); // 遍历属性列表,查找指定的属性 if (proDescrtptors ! beanInfo = Introspector.getBeanInfo(UserInfo.class); PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors
2.3 忽略信息配置public static final String IGNORE_BEANINFO_PROPERTY_NAME = "spring.beaninfo.ignore";private , ignore.toString()); }}上述代码根据 Spring 环境配置动态设置系统属性 "spring.beaninfo.ignore"。 spring.beaninfo.ignore :用于决定是否跳过 BeanInfo 类的扫描,如果设置为 true,则跳过。 典型的应用场景:加速本地开发:在 IDE 中运行应用时,默认跳过 BeanInfo 解析以减少启动时间。 解决类冲突:当类路径中存在错误的 BeanInfo 实现时,强制忽略以避免出现 ClassNotFoundException。微服务优化:在容器化部署中,通过默认配置减少资源占用,提升启动效率。
String,Object> map = null; try { map = new HashMap<String, Object>(); BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors
Object> backupProp(Object bean){ Map<String, Object> result = new HashMap<String, Object>(); try{ BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors result; } public static void restoreProp(Object bean, Map<String, Object> propMap){ try { BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors