互联网科技Java 杂谈Java

Java反射——Web学习的灵魂!

2019-07-24  本文已影响2人  java菲菲

我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 —— Class类对象阶段 —— Runtime运行时阶段 而我们知道,Java中一个类在源代码阶段,是存储在硬盘中的,而编译后,就已经被加载到内存中区,那么有没有一种方法可以在这种情况下,获取或者修改它的方法或者属性呢?这就是我们今天所讲的Java反射机制

01 概述以及好处

(1) 概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

我们将类分为三部分,成员变量,构造方法,成员方法,代码编译后,变成了字节码文件(.class文件)而万物皆对象,所以在字节码文件中,又将这三部分分别整合成对象,所以我们得出结论:

反射:将类的各个组成部分封装成对象,并通过这个Class类型的对象,去使用该文件中的成员变量,构造方法,成员方法

(2) 好处

① 可以在程序“运行时”,对 .class文件进行操作,并且由此获取以及操作 类中的各个部分

② 可以解耦,提高程序的扩展性

③ 增加程序的灵活性 (最后案例中体现)

02   获取Class对象的方式

(1)将字节码文件加载进内存,返回Class对象 

多用于配置文件,将类名定义在配置文件中。读取文件,加载类

Class.forName("全类名")

(2)多用于参数的传递

类名.class

(3)getClass()方法在Object类中定义着 

多用于对象的获取字节码的方式

对象.getClass():

三种方式的代码实现

通过上面的案例我们可以得出:

同一个字节码文件(*.class)在一次程序运行过程中,只加载一次,不论通过哪一种方式获取的Class对象都是同一个

03 Class对象功能

(1) 获取功能

① 获取成员变量们

② 构造方法们

③ 获取成员方法们

④ 获取全类名

 ⑤Field:成员变量

 ⑥Constructor:构造方法

⑦ Method:方法对象

我们来具体使用一下上面的一些方法:

  *获取成员变量们

 * Field[] getFields()

* Field getField(String name)

* Field[] getDeclaredFields()

 Field getDeclaredField(String name)

*获取构造方法们

* Constructor<?>[] getConstructors()

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

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

* Constructor<?>[] getDeclaredConstructors()

*获取成员方法们

* Method[] getMethods()

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

* Method[] getDeclaredMethods()

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

04 反射案例

通过修改配置文件,达到不改变该类的任何代码,可以创建任意类的对象,可以执行任意方法,避免了每一次都修改类文件的缺点,同时提高了程序的扩展性

我仅仅浅薄的谈了一下反射的基本知识,也有很多不足之处,希望能与大家交流。

上一篇 下一篇

猜你喜欢

热点阅读