java基础--Java内省机制

1.前置

在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。

2.java内省

Java内省机制是指通过标准的get/set方法(利用发射调用成员方法)对成员属性进行操作,而不是直接通过反射对属性操作。
javabean的概念需要了解一下,内省机制相关类在java.beans包下面。
java.beans包包含了开发bean相关的类,各种操作自定义bean的类,比如持久化类实例,内省实现。(javadoc)
主要类是:BeanInfo、Introspetor:

class
BeanInfoBeanInfo接口定义了一些规范接口,其中的方法就规定了我们能获得beaninfo。
Introspetor类主要作用还是其中定义的静态方法,主要是获取指定class的beanInfo
propertyDescriptor这个就是属性描述器,主要就是调用set/get方法的入口
PropertyEditorPropertyEditor是JavaBean规范定义的接口,这是java.beans中一个接口,其设计的意图是图形化编程上,方便对象与String之间的转换工作,而Spring将其扩展,方便各种对象与String之间的转换工作。这里还是没搞懂,可以去github找找代码看看
PropertyEditorManagerPropertyEditorManager 可用于定位任何给定类型名称的属性编辑器。此属性编辑器必须支持 java.beans.PropertyEditor 接口以编辑给定对象。主要方法就是注册一个properEditor和获取指定Editor
ThreadGroupContextIntrosptor中用来存BeanInfo的容器(和主流程无关,经常出现的概念Thread ThreadGroup ThreadLocal ThreadGroupContext )
   // 这里的Person自己随便写一个类就好了
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
        PropertyDescriptor[] beanDescriptor = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : beanDescriptor) {
            System.out.println(propertyDescriptor.getName());
        }

        Person person = new Person();
        PropertyDescriptor pd = new PropertyDescriptor("name", Person.class);
        // 得到属性的写方法,为属性赋值
        Method method = pd.getWriteMethod(); // setName()
        method.invoke(person, "Tom");
        // 获取属性的值
        method = pd.getReadMethod(); // getName()
        System.out.println(method.invoke(person, null));
        

3.beanUtils

beanutils工具包
以上的操作略显繁琐,Apache组织开发了一套用于操作JavaBean的API——beanutils,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写。

4.spring的解决方法

引入spring中
BeanWrapperImpl,基于内省,依赖getter/setter方法
DirectFieldAccessor,基于反射,不需要提供getter/setter方法

学习Spring必学的Java基础知识(3)----PropertyEditor
https://www.iteye.com/blog/stamen-1525668
【Java基础】属性编辑器PropertyEditor:https://blog.csdn.net/shenchaohao12321/article/details/80295371

深入SPRING官网系列(十六):DATABINDER详细解析:
https://www.freesion.com/article/32411421362/
简单来说:这个是通过get和set来玩的,同时:
1.// 这里是为了解决嵌套属性的情况,比如一个person对象中,包含一个dog对象,dog对象中有一个name属性
// 那么我们可以通过dog.name这种方式来将一个名字直接绑定到person中的dog上
// 与此同时,我们不能再使用person的属性访问器了,因为使用dog的属性访问器,这里就是返回dog的属性访问器
2. // PropertyTokenHolder是什么呢?例如我们的Person对象中有一个List name的属性,
// 那么我们在绑定时,需要对List中的元素进行赋值,所有我们会使用name[0],name[1]这种方式来进行绑定,
// 而PropertyTokenHolder中有三个属性,其中actualName代表name,canonicalName代表整个表达式name[0],而key则代表0这个下标位置
3. 同时还具有类型转换的能力
https://www.jianshu.com/p/b11af8ff4106

4 基于内省机制的框架

jackJson 序列化工具是基于内省的,这个可以自己写个小demo测试
spring databinder

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值