浅谈-Java的反射机制

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类来获取。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值