前言
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类是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、安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
[鉴于作者才疏学浅,文中不足之处还望你不吝斧正,如有雷同纯属巧合]