Java中的反射

2020-06-26  本文已影响0人  一如既暀丶

反射的定义

        Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 


反射的好处

我们在第一次接触反射的时候,总会有个很大的疑问,反射看起来好麻烦啊,各种get.get,他究竟有什么好处,能用来做什么呢?

我们先来看一下《编程思想》这本书中是怎么说的.

RTTI(Run-Time Type Identification,通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型)和反射之间真正的区别只在于,对RTTI来说,编译器在在编译时打开和检查.class文件.(换句话说,我们可以用"普通"方式调用对象的所有方法).对于反射机制来说,.class文件在编译时是不可获取的,所以在运行时打开和检查.class文件。 --《编程思想》

这段话看起来很叼的样子,有点云里雾里的,首先RTTI的意思就是以普通的方式来创建对象,调用方法,就是我们常用的new关键字。这段话的意思简化版就是:编译器将.java文件编译成.class文件之后,普通方式创建的对象就不能再变了,我只能选择是运行还是不运行这个.class文件。是不是感觉很僵硬,假如现在我有个写好的程序已经放在了服务器上,每天供人家来访问,这时候Mysql数据库宕掉了,改用Oracle,这时候该怎么怎么办呢?假如没有反射的话,我们是不是得修改代码,将Mysql驱动改为Oracle驱动,重新编译运行,再放到服务器上。是不是很麻烦,还影响用户的访问。

假如我们使用反射Class.forName()来加载驱动,只需要修改配置文件就可以动态加载这个类,Class.forName()生成的结果在编译时是不可知的,只有在运行的时候才能加载这个类,换句话说,此时我们是不需要将程序停下来,只需要修改配置文件里面的信息就可以了。这样当有用户在浏览器访问这个网站时,都不会感觉到服务器程序程序发生了变化。



Class对象功能:

获取功能:

1. 获取成员变量们

* Field[] getFields() :获取所有public修饰的成员变量

* Field getField(String name)  获取指定名称的 public修饰的成员变量

* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符

* Field getDeclaredField(String name) 

2. 获取构造方法们

* Constructor<?>[] getConstructors() 

* Constructor<T> getConstructor(类<?>... parameterTypes) 

* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 

* Constructor<?>[] getDeclaredConstructors() 

3. 获取成员方法们:

* Method[] getMethods() 

* Method getMethod(String name, 类<?>... parameterTypes) 

* Method[] getDeclaredMethods() 

* Method getDeclaredMethod(String name, 类<?>... parameterTypes) 

4. 获取全类名

* String getName() 

上一篇下一篇

猜你喜欢

热点阅读