[Java] 反射

Posted cxc1357

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

以上是关于[Java] 反射的主要内容,如果未能解决你的问题,请参考以下文章

Java Reflection (JAVA反射)机制详解

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

反射机制在java中如何做呀?

如何利用java的反射机制动态创建对象

Java反射详解:入门+使用+原理+应用场景

Java反射之剖析方法