Java反射机制是什么?

Java反射机制是Java语言的一个重要特性。在学习Java反射机制前,大家应该先了解两个概念,编译期和运行期。

编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。

运行期是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

Java反射机制在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法。此外,在ORM中间件的实现中,运用Java反射机制可以读取任意一个JavaBean的所有属性,或者给这些属性赋值。

Java反射机制主要提供了以下功能,这些功能都位于java.lang.reflect包。

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法。

生成动态代理。

要想知道一个类的属性和方法,必须先获取到该类的字节码文件对象。获取类的信息时,使用的就是Class类中的方法。所以先要获取到每一个字节码文件(.class)对应的Class类型的对象.

众所周知,所有Java类均继承了Object类,在Object类中定义了一个getClass()方法,该方法返回同一个类型为Class的对象。例如,下面的示例代码:

Class labelCls = label1.getClass(); // label1为 JLabel 类的对象1复制代码类型:[java]

利用Class类的对象labelCls可以访问labelCls对象的描述信息、JLabel类的信息以及基类Object的信息。表1列出了通过反射可以访问的信息。

表1反射可访问的常用信息

类型 访问方法 返回值类型 说明
包路径 getPackage() Package 对象 获取该类的存放路径
类名称 getName() String 对象 获取该类的名称
继承类 getSuperclass() Class 对象 获取该类继承的类
实现接口 getlnterfaces() Class 型数组 获取该类实现的所有接口
构造方法 getConstructors() Constructor 型数组 获取所有权限为 public 的构造方法
getDeclaredContruectors() Constructor 对象 获取当前对象的所有构造方法
方法 getMethods() Methods 型数组 获取所有权限为 public 的方法
getDeclaredMethods() Methods 对象 获取当前对象的所有方法
成员变量 getFields() Field 型数组 获取所有权限为 public 的成员变量
getDeclareFileds() Field 对象 获取当前对象的所有成员变量
内部类 getClasses() Class 型数组 获取所有权限为 public 的内部类
getDeclaredClasses() Class 型数组 获取所有内部类
内部类的声明类 getDeclaringClass() Class 对象 如果该类为内部类,则返回它的成员类,否则返回 null

如表1所示,在调用getFields()和getMethods()方法时将会依次获取权限为public的字段和变量,然后将包含从超类中继承到的成员变量和方法。而通过getDeclareFields()和getDeclareMethod()只是获取在本类中定义的成员变量和方法。

Java反射机制的优缺点

优点:

能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。

与Java动态编译相结合,可以实现无比强大的功能。

对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

缺点:

反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;

反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。

Java反射机制在一般的Java应用开发中很少使用,即便是JavaEE阶段也很少使用。

(0)

相关推荐

  • 吊打面试官系列:说说反射的用途及实现?

    反射是什么? 反射是Java程序开发语言的特征之一,它允许动态地发现和绑定类.方法.字段,以及所有其他的由于有所产生的的元素.通过反射,能够在需要时完成创建实例.调用方法和访问字段的工作. 反射机制主 ...

  • 【Java面试题第七期】一文回答面试中常见反射问题?

    java反射的作用 反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意个对象,都能够调用它的任意一个方法.在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信 ...

  • java中的反射机制

    前言: ​相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解AP ...

  • Java反射机制API

    实现Java反射机制的类都位于java.lang.reflect包中,java.lang.Class类是Java反射机制API中的核心类.本节将从这两个方面讲解Java反射机制API. java.la ...

  • Android插件化开发基础之Java反射机制研究

    一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...

  • Java反射

    一.概念 运行状态中知道类所有的属性和方法. 在Java中的反射机制是指在运行状态中,对于任意一个类都能知道这个类的所有属性和方法,并且对于任意一个对象,都能调用它的任意一个方法.这种能够获取信息以及 ...

  • Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  • Java SPI机制详解

    SPI介绍 SPI ,全称为 Service Provider Interface,是一种服务发现机制,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件. SPI的 ...

  • Java事件处理机制

    Java事件处理机制 Java事件处理机制涉及三个成员:事件源.事件和事件监听器 事件源:Java的AWT或Swing组件,该组件就是事件源,通过new关键字即可创建 事件:由系统自动产生 事件监听器 ...

  • 小白也能看懂的Java异常处理机制

    异常处理是开发过程中不可或缺的一部分,用户希望看到一个可以接受的错误信息,开发运维人员也希望可以看到详细的错误信息.因此在开发过程中,应重视异常处理.异常处理过程中有几个常见的乱象,例如没有固定的规范 ...

  • JAVA反射调用无参构造、有参构造、普通方法、私有方法,成员变量操作

    JAVA反射调用无参构造.有参构造.普通方法.成员操作 Person类 package demo; public class Person { private String id; private S ...