Java是面向对象的编程语言,万物皆对象,反射技术就是把类声明、类中的字段声明、方法声明、构造函数声明等都看成是对象,从而可以把类中的各个部分拆解出来单独处理,反射技术主要用来编写通用功能,平时编程使用并不多。

  反射技术所包含的类的含义非常简洁直观:

  Class → 类声明

  Constructor → 构造函数声明

  Field → 字段声明

  Method → 方法声明

  抽象的地方在于通过反射类的对象访问普通对象的内容,其实这也算是另一种访问方式,和平时的访问方式时等价的。

  • Java反射的知识结构图

  • Class

  一个Class对象表示一个类声明,通过Class对象可以获得该类声明的有关信息,比如类名、父类、类中的字段、类中的方法等。Class对象在.class文件被加载到内存时创建。

  主要有三种方式获得一个类声明对应的Class对象

对象.getClass()

类名.class

Class.forName("全类名")

  Class的主要方法

String  getSimpleName()   //获得类的简单名称
String getName() //获取全类名
Class getSuperclass() //获得父类的Class对象
boolean isArray() //判断该类是否是数组
Object newInstance() //调用该类的无参构造函数创建该类对象 Constructors getConstructors() //获得所有的public构造函数
Constructors getConstructor(paramTypes) //获得指定参数类型的public构造函数
Field[] getFields() //获得所有的public字段,包括父类的
Field getField(name) //获得指定名称的public字段,包括父类的
Method[] getMethods() //获得所有的public方法,包括父类的
Method getMethod(name, paramTypes) //获得指定名称和参数类型的public方法,包括父类的 Constructors getDeclaredConstructors() //获得本类声明的所有构造函数
Constructors getDeclaredConstructor(paramTypes) //获得本类声明的所有指定参数类型的构造函数
Field[] getDeclaredFields() //获得本类声明的所有字段
Field getDeclaredField(name) //获得本类声明的指定名称的字段
Method[] getDeclaredMethods() //获得本类声明的所有方法
Method getDeclaredMethod(name, paramTypes) //获得本类声明的所有指定参数类型的方法
  • Constructor

  Constructor表示构造函数声明,一个Constructor对象就表示一个普通类的构造函数,既然表示一个构造函数,当然可以用来创建该普通类的对象:

Object obj = constructor.newInstance(initargs);

  其实Class的newInstance()内部就是调用Constructor的newInstance()来创建对象的

  • Field

  Field表示字段声明,一个Field对象就表示一个普通类的字段,既然表示一个字段,当然可以用来获取普通对象中该字段的值,也可以给该字段赋值

field.get(obj); //获得obj对象中该字段的值
field.set(obj, newValue); //给obj对象中该字段赋值

  如果Field对象表示的是private字段,可能需要调用field.setAccessible(true) 才能访问该字段

    其实debug模式执行程序时看到的对象的字段值都是通过Field拿到的

  • Method

  Method表示方法声明,一个Method对象就表示一个普通类的方法,既然表示一个方法,当然就可以调用这个方法:

//假如method表示add方法
method.invoke(obj, num1, num2); //使用obj对象调用该add方法
// 等价于obj.add(num1,num2)

最新文章

  1. Java职业生涯规划
  2. webpack入坑之旅(三)webpack.config入门
  3. NYOJ题目769乘数密码
  4. 您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序
  5. oracle存储过程、声明变量、for循环|转|
  6. 【leetcode】Dungeon Game (middle)
  7. Java性能漫谈-数组复制之System.arraycopy
  8. ABP入门教程
  9. HDU 5652 India and China Origins
  10. A+B problem (High-precision)
  11. java线程学习(二)
  12. JVM中堆内存和栈内存的区别
  13. 关于a标签颜色的探索
  14. 初识Spider_Man(爬爬虫)
  15. WEB学习小笔记
  16. delphi 各版本的特性
  17. 【emWin】例程二十七:窗口对象——Listview
  18. pythonCharm 破解
  19. arc 093 D – Grid Components
  20. HDU 1907:John(尼姆博弈变形)

热门文章

  1. Java算法练习——无重复字符的最长子串
  2. struct寻址&for反汇编
  3. CI中site_url()和base_url()的区别
  4. nodejs(7)练习 http 和 express 创建简单的服务器
  5. 最短路———Floyd算法
  6. 十一、GUI设计-记事本程序
  7. Git 报错:Updates were rejected because the tip of your current branch is behind
  8. 正文内容 python3编码问题
  9. LGOJ4299 首都
  10. MyBatis项目报错:The server time zone value '�й�׼' is unrecognized or represents more than one time zone