Java进阶知识学习:反射

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

引入-Java为啥可以被称为半动态语言

  1. 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C,C++则不属于动态语言.从反射角度来说,Java属于半动态语言

反射的概念

  1. 反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序.这项功能被大量地应用到JavaBean中(相信学过Spring体系的小伙伴都很清楚了吧).反射也是一种帮助我们分析类能力的程序.
  2. 在Java中反射机制是指在运行状态下,对于任意一个类都能够知道这个类的所有属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制.

反射的作用

  1. 动态的加载类,动态的获取类的信息(属性,方法,构造器)
  2. 动态的构造对象
  3. 动态调用类和对象的任意方法,构造器
  4. 获取泛型信息
  5. 处理注解

编译时类型和运行时类型

  1. 在Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型.编译时的类型由声明对象时使用的类型来决定,运行时的类型由实际创建的对象类型来决定.如下图中,编译时类型为Person,运行时类型为Student.
    在这里插入图片描述
  2. 程序在运行时还可能接收到外部传入的对象,比如该对象编译时类型为Object,但是程序有时候需要调用该对象运行时类型的方法.为了解决这些问题,程序需要在运行时发现对象和类的真实信息.这时候就需要用到反射了.

反射API

  1. 反射API用来生成JVM中的类,接口或对象的信息
  2. 常见API
     1)Class类:反射的核心类,可以获取类的属性,方法等信息
     2)Field类:java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类中的属性值
     3)Method类:java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法
     4)Constructor类:java.lang.reflec包中的类,表示类的构造方法

获取Class对象的3种方法

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
     多用于配置文件,将类名定义在配置文件中.读取文件,加载类
  2. 类名.class:通过类名的属性class获取
     多用于参数传递
  3. 对象.getClass():getClass()方法在Object类中进行了定义
     多用于对象获取字节码的方式
  4. 结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次了,不论通过哪一种方式获取的Class对象都是同一个
  5. Class对象的功能
     1) 获取成员变量们
      Field[] getFields() :获取所有public修饰的成员变量
      Field getField(String name) 获取指定名称的 public修饰的成员变量
      Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
      Field getDeclaredField(String name)
     2) 获取构造方法们
      Constructor<?>[] getConstructors()
      Constructor getConstructor(类<?>… parameterTypes)
      Constructor getDeclaredConstructor(类<?>… parameterTypes)
      Constructor<?>[] getDeclaredConstructors()
     3)获取成员方法们
      Method[] getMethods()
      Method getMethod(String name, 类<?>… parameterTypes)
      Method[] getDeclaredMethods()
      Method getDeclaredMethod(String name, 类<?>… parameterTypes)
     4)获取全类名
      String getName()
  6. 常见方法演示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

创建对象的两种方式

  1. Class对象的newInstance()
     使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类存在默认的构造器
  2. 调用Constructor对象的newInstance()
     先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对象对应类的实例,这种方法可以选定需要的构造方法创建对象实例.
  3. 方法演示
    在这里插入图片描述

反射常用方法

  1. 获取类的名字
    在这里插入图片描述
  2. 获取类的属性
    在这里插入图片描述
  3. 获取类的方法
    在这里插入图片描述
  4. 获得构造方法
    在这里插入图片描述

提高反射的性能

  1. 反射机制在程序运行时性能上有一定的影响,速度慢一点
    在这里插入图片描述
  2. 改善方法
     1)setAccessible启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消java语言访问检查,值为false则指示反射的对象应访问实施java语言访问检查,并不是为true就能访问为false就不能访问
     2)禁止安全检查,可以提高反射的运行速度
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41649001/article/details/106692359