美文网首页互联网科技Java 杂谈Java
Java反射——Web学习的灵魂!

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

作者: java菲菲 | 来源:发表于2019-07-24 15:39 被阅读2次

    我们从最初的 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 反射案例

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

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

    相关文章

      网友评论

        本文标题:Java反射——Web学习的灵魂!

        本文链接:https://www.haomeiwen.com/subject/qmuxrctx.html