Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,成员函数等信息。这一特性使得反射机制被常常用在框架中,想要比较系统的了解Kotlin中的反射,先从Java的反射说起。
Java中的反射
通常我们写好的.java源码文件,经过javac的编译,最终生成了.class字节码文件。这些字节码文件是与平台无关的,使用时通过Classloader去加载这些.class字节码文件,从而让程序按照我们编写好的业务逻辑运行。Java的反射主要是从这些.class文件中获取我们想要得到的内容,那么Java中的反射能够得到哪些内容呢?
获取Class对象
Java是面向对象的语言,同样的.class字节码文件也不例外,想要获取.class文件中的内容,就要先获取.class文件对应的Class对象。Java中获取Class对象的方式有三种。
//1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名)
Class baseInfo = Class.forName("top.sguotao.ReflectionJava");
//2.类名.class
Class object = Object.class;
//3.实例对象.getClass()
Class date = (new Date()).getClass();
Class testclass = this.getClass();
获取类的构造函数Constructor
获取Class对象之后,就可以获取其中的构造函数,从而去创建实例对象。类的构造函数对应java.lang.reflect.Constructor。获取构造函数归纳起来有以下五种方式:
// 1.获取参数列表是parameterTypes,访问控制符是public的构造函数
public Constructor getConstructor(Class[] parameterTypes)
// 2.获取所有访问控制符是public的构造函数
public Constructor[] getConstructors()
// 3.获取参数列表是parameterTypes,并且是类自身声明的构造函数,访问控制符包含public、protected和private的函数。
public Constructor getDeclaredConstructor(Class[] parameterTypes)
//4.获取类自身声明的全部的构造函数,访问控制符包含public、protected和private的函数。
public Constructor[] getDeclaredConstructors()
//5.如果类声明在其它类的构造函数中,返回该类所在的构造函数,如果存在则返回,不存在返回null
public Constructor get