欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈-Java的反射机制

程序员文章站 2024-02-09 18:06:00
...

1  什么是反射机制?

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

说简:

动态获取类中的信息,就是java反射机制。可以理解为对类的解剖。只是获得它的字节码(class对象)

 

 

2 说说反射机制的作用。

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

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

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

(4)在运行时调用任意一个对象的方法,甚至可以调用private方法。
生成动态代理。

 

 

 

 

3 .反射机制会不会有性能问题?

      反射机制对性能会有影响,使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作

调用Java的反射API是有较高的性能开销的:

      (1):产生了Dynamic Resolve

无论是通过字符串获取Class、Method还是Field,都需要JVM的动态链接机制动态的进行解析和匹配,势必造成性能开销。

(2):安全性验证

每一次的反射调用都会造成Java安全机制进行额外的安全性验证,造成性能开销。

(3)影响运行时优化

反射包括了一些动态类型,反射代码使得许多JVM的运行时优化无法进行。反射操作的效率要比那些非反射操作低得多,我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射

处理方法
针对此,常见的处理方法主要有以下几种:
1.使用Cache
针对上述原因1: 对通过反射调用获得的Class、Method、Field实例进行缓存,避免多次Dynamic Resolve。
2.使用MethodHandle类
针对上述原因2:Java 7开始提供了java.lang.invoke.MethodHandle类,MethodHandle类的安全性验证在获取实例时进行而不是每次调用时都要进行验证,减小开销。
3.使用Runtime创建的类
该方法最为强大,可以针对上述原因1、2、3进行全面优化。具体做法为:

在编译时设计好一个接口,由该接口封装所有的反射调用。

在运行时动态生成一个类实现该接口,该动态生成的类一旦完成define就和普通类没有区别,不需要后续的Dynamic Resolve,没有额外的安全性验证,也不会影响JVM的运行时优化。
该方法不能覆盖反射API的所有Use case,例如某个反射调用需要修改某实例的private字段,是无法动态生成一个合法的类这样去做的。

 

反射的使用(这里使用Student类做演示)

先写一个Student类。

 

1、获取Class对象的三种方式

1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String  className)(常用)

 

其中1.1是因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取。

相关标签: Class 反射