引言:
之前上网课的时候听过老师说过一句话:你辛辛苦苦努力花了一天的时间写出来的代码质量或许还没有别人两个小时写出来的代码质量好,只因别人对于知识的理解层次要比你深的多。当学反射的时候,心里总是想:这样的技术真的会在实战中用得到吗?我就不能调用构造方法new出一个对象吗?为什么要奇奇怪怪的方式获得一个对象?。不过现在我明白了重要的不是怎么去获得一个对象,重要的是当遇到一个问题的时候如果不去解决它,那么它永远都是提升自己实力的最大绊脚石。今天就来简单的理解一下反射。
什么是反射?
- JAVA反射机制是在运行状态中
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单来说,java反射就是在动态的过程中,能够剖析任意一个类和对象,动态的获取他们方法和属性等并且将它们映射成对象以便对它们进行操作。
反射能够做什么?
在我的理解中,反射可以根据路径动态的获取不同的类的相关属性和方法,能够降低代码的耦合程度,最直接的就是将路径写在xml的配置文件中,可以实现修改xml配置文件而不修改代码的实现应用的修改。
如何获取一个Class对象?
-
Object类中有一个getClass()方法,那么new出的一个对象自然有getClass()方法,利用此方法可以获得一个Class对象。
Student s = new Student();
Class class = s.getClass(); //获得class对象 -
任何数据类型都有一个class的静态属性
Class class2 = s.class; -
直接调用Class类库中的forName(String Path)方法,参数传入一个真实的类路径,例如:“com.xxx.Student”
部分方法:
获取构造方法的函数:
getConstuctors(),获取的构造函数全部是public属性的。
getConstuctor(Class … params),根据参数,从所有public属性的构造函数中获取相关构造函数
getDelaredConstructors(),获取所有的构造函数
getDelaredConstructor(Class … params),根据参数,从所有的构造函数中获取相关构造函数
获取方法的方法:
getMethods()返回类中所有的public属性的方法,包括从基类继承的public方法。
getDeclaredMethods()返回类本身声明的方法,包括复写的方法,不包括从基类继承的方法
getMethod(name,params)根据参数从getMethods()返回的结果中筛选
getDeclaredMethod(name, params)根据参数从getDeclaredMethods()返回的结果中筛选
获取属性的方法:
getFields()获取类的所有public属性的成员变量
getDeclaredFields()获取类的所有成员变量
getMethod(name, params)根据参数在getFields()获取的成员变量中进行筛选
getDeclaredMethod(name, params)根据参数在getDeclaredFields()获取的成员变量中进行筛选
emmm还记得之前上课的时候老师提到过反射在框架中相当的重要,这只是一些简单内容的总结,具体的操作等更加深入了解再次补充。