java中的反射

什么是反射

首先让我们认识一下什么是反射,在Java核心卷I中是这样介绍的。

反射库( reflection library) 提供了一个非常丰富且精心设计的工具集, 以便编写能够动
态操纵 Java 代码的程序。这项功能被大量地应用于 JavaBeans 中, 它是 Java组件的体系结构
(有关 JavaBeans 的详细内容在卷 II 中阐述)。使用反射, Java 可以支持 Visual Basic 用户习惯
使用的工具。特别是在设计或运行中添加新类时, 能够快速地应用开发工具动态地查询新添
加类的能力。
能够分析类能力的程序称为反射(reflective )。反射机制的功能极其强大,在下面可以看
到, 反射机制可以用来:
•在运行时分析类的能力。
•在运行时查看对象, 例如, 编写一个 toString 方法供所有类使用。
•实现通用的数组操作代码。
•利用 Method 对象, 这个对象很像中的函数指针。
反射是一种功能强大且复杂的机制。 使用它的主要人员是工具构造者,而不是应用程序
员。

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

反射赋予了jvm动态编译的能力。动态编译可以最大限度的体现Java的灵活性(多态)。

Class类

在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识。
这个信息跟踪着每个对象所属的类。 虚拟机利用运行时类型信息选择相应的方法执行。
然而,可以通过专门的 Java 类访问这些信息。保存这些信息的类被称为 Class, 这 个 名
字很容易让人混淆。Object 类中的 getClass( ) 方法将会返回一个 Class 类型的实例。

要想使用反射,首先需要获得待操作的类所对应的Class对象。

Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。

这个Class对象是由JVM生成的,通过它能够获悉整个类的结构。

反射获取类信息的三种常用方式

创建反射的三种方式

反射的实现原理

java类加载:java类加载就是类加载器根据类的全限定名把.class的二进制字节码代表的静态存储结构转化为方法区的运行时数据结构,然后在内存中生成代表该类的Class对象,一个类有且只有一个Class对象。每次生成Java对象实际上都是通过这个Class对象获取整个类的结构并生成相应的java对象。(接口和抽象类也会被加载为class对象)

所以我们为什么需要反射呢

一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现。
java的动态代理就是通过反射实现的,而AOP的核心是动态代理(CGLIB动态代理和java的动态代理),AOP的应用案例有mybatis、微服务中的消费者等。

Java中编译类型有两种:

静态编译:在编译时确定类型,绑定对象即通过。

动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

Reflection可以在运行时加载、探知、使用编译期间完全未知的classes。即Java程序可以加载一个运行时才得知名称的class,获取其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。

反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构与行为。在静态语言中,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。如果想在运行时改变,就需要反射这东西了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值