深入浅出Java反射

前言

Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

概念

什么是反射?JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。

总结:反射就是程序运行期间JVM会对任意一个类洞悉它的属性和方法,对任意一个对象都能够访问它的属性和方法,即把Java类中的各种成分映射成一个个的Java对象;
通俗概括反射就是让你可以通过名称来得到对象的信息(如类,属性,方法等) 的技术

反射的应用

Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;
  • 生成动态代理。 (java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。Java的动态代理就是利用了反射的特性来实现的。有关动态代理参看我的另一篇文章)
  • Java反射工具类 主要在设计模式,框架中用到。

反射的理解

静态加载和动态加载
静态加载(需要重新编译):

//获取User的实例对象
User user = new User();

动态加载(不需要重新编译):

 Class c3 = Class.forName("java.reflect.User");

举个栗子:
我们手机里的app要更新升级的时候,即使你不更新,也可以正常使用,但是不能使用更新的功能。我们的杀毒软件,需要下载一个功能插件时,不需要卸载掉重新安装完整版,只需要下载插件即可。这里面就用到了反射的知识哦。不需要重新编译,扩展所需功能即可。

Java Reflection API简介

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

  • Class类:代表一个类。
  • Field类:代表类的成员变量(成员变量也称为类的属性)。
  • Method类:代表类的方法。
  • Constructor类:代表类的构造方法。
  • Array类:提供了动态创建数组,以及访问数组元素的静态方法。
Class类 展开查看

 Class类是Reflection API中的核心类,它有以下方法。
* getName():获得类的完整名字。
* getFields():获得类的public类型的属性。
* getDeclaredFields():获得类的所有属性。
* getMethods():获得类的public类型的方法。
* getDeclaredMethods():获得类的所有方法。
* getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
* getConstrutors():获得类的public类型的构造方法。
* getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
获取class对象方法 展开查看

获取class对象方法
* 1.使用Class类的静态方法 eg:Class.forName(“java.lang.String”);
* 2.使用类的.class语法 eg:Class c = Employee.class;
* 3.使用对象的getClass()方法 eg:Employee e = new Employee(); Class c3 = e.getClass(); 

优缺点

优点: 运行期类型的判断,动态加载类,提高代码灵活度。
缺点:

  • 1、性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。
  • 2、安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。

[鉴于作者才疏学浅,文中不足之处还望你不吝斧正,如有雷同纯属巧合]

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值