zoukankan      html  css  js  c++  java
  • [Java] 反射

    背景

    • Java中最为重要的特性
    • 运行时,通过对象获得此对象所在类的信息,查看或修改类的接口、方法、成员变量的属性等
    • 几乎所有开发框架及应用技术中都是基于反射

    获取类对象

    • 类对象:描述这种类有什么属性和方法
    • 一个类只会有一个类对象存在
    • 获取方式
      • Class.forName
      • Hero.class
      • new Hero().getClass()
    • 获取类对象时,会导致类的属性被初始化

    创建对象

    • 先拿到Hero的类对象
    • 通过类对象获取构造器对象
    • 再通过构造器对象创建一个对象

    访问属性

    • Class<?>.getFields():只能获取public,包括从父类继承来的字段
    • Class<?>.getDeclaredFields():可获取本类所有的字段,包括private,但不能获取继承来的字段

    调用方法

    • Class<?>.getMethods():获取类的全部方法
    • Class<?>.getConstructors():获取类的全部构造方法
    • Method.getParameterCount():获取方法参数数量
    • Method.invoke():调用方法

    应用

    • Spring依赖注入、反转控制
    • 使用时,在文本文件里写好类名,方法名
    • 当同样位置用到的类和方法改变时,就不用改源代码了,直接改文本文件即可

    实例

    • 需求
      • 用户下单,订单创建后保存到MongoDB
      • pojo<-->Document-->Dao
    • 传统方式代码存在的问题
      • 每个pojo都需要一个将它转换为Document的方法(如order2Doc、product2Doc),如果pojo增加字段,相应方法也要修改
      • 每个pojo都需要一个对应的Dao,不同pojo对应的Dao很类似(增删改查,orderDao、productDao),存在大量重复代码
    • 优化
      • 反射实现pojo和Document转换(各字段put到Document)
      • 泛型实现代码复用(不同pojo不用再写不同Dao)

    分析

    • pojo:Order和Product类

    • pojo-->Document

    • 持久化:Document-->Dao

     

    • 反射查看Order实例的属性

    • 反射版本的pojo2Doc和doc2pojo

     

    • 调用

     

    • 泛型基础类,在MongoDB中存取任意pojo

     

    • OrderDao实例化基础类

    • 调用

      

    参考

    invoke()

    https://zhidao.baidu.com/question/394854109.html

  • 相关阅读:
    【转载】C++针对ini配置文件读写大全
    CString向char类型转化 ---“=”: 无法从“wchar_t *”转换为“char *
    使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数
    16进制串hex与ASCII字符串相互转换
    【转载】CCombobox使用大全
    获取c++ edit控件内容
    [转载]C++ CString与int 互转
    MacOS Cocos2d-x-3.2 创建HelloWorld项目
    构建之法阅读笔记6--敏捷开发2
    进度条--第十二周
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12462412.html
Copyright © 2011-2022 走看看