Java基础知识学习:反射
目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
引入-Java为啥可以被称为半动态语言
- 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C,C++则不属于动态语言.
从反射角度来说
,Java属于半动态语言
反射的概念
-
反射库
提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序.这项功能被大量地应用到JavaBean中(相信学过Spring体系的小伙伴都很清楚了吧).反射也是一种帮助我们分析类能力的程序. - 在Java中反射机制是指
在运行状态下,对于任意一个类都能够知道这个类的所有属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法
,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制.
反射的作用
- 动态的加载类,动态的获取类的信息(属性,方法,构造器)
- 动态的构造对象
- 动态调用类和对象的任意方法,构造器
- 获取泛型信息
- 处理注解
编译时类型和运行时类型
- 在Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型.编译时的类型由声明对象时使用的类型来决定,运行时的类型由实际创建的对象类型来决定.如下图中,编译时类型为Person,运行时类型为Student.
- 程序在运行时还可能接收到外部传入的对象,比如该对象编译时类型为Object,但是程序有时候需要调用该对象运行时类型的方法.为了解决这些问题,程序需要在运行时发现对象和类的真实信息.这时候就需要用到反射了.
反射API
- 反射API用来生成JVM中的类,接口或对象的信息
- 常见API
1)Class类:反射的核心类,可以获取类的属性,方法等信息
2)Field类:java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类中的属性值
3)Method类:java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法
4)Constructor类:java.lang.reflec包中的类,表示类的构造方法
获取Class对象的3种方法
-
Class.forName("全类名")
:将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中.读取文件,加载类 - 类名.class:通过类名的属性class获取
多用于参数传递 - 对象.getClass():getClass()方法在Object类中进行了定义
多用于对象获取字节码的方式 - 结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次了,不论通过哪一种方式获取的Class对象都是同一个
- 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() - 常见方法演示
创建对象的两种方式
- Class对象的newInstance()
使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类存在默认的构造器
- 调用Constructor对象的newInstance()
先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对象对应类的实例,这种方法可以选定需要的构造方法创建对象实例. - 方法演示
反射常用方法
- 获取类的名字
- 获取类的属性
- 获取类的方法
- 获得构造方法
提高反射的性能
- 反射机制在程序运行时性能上有一定的影响,速度慢一点
- 改善方法
1)setAccessible启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消java语言访问检查,值为false则指示反射的对象应访问实施java语言访问检查,并不是为true就能访问为false就不能访问
2)禁止安全检查,可以提高反射的运行速度