反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是java被视为动态语言的关键。
Java反射机制主要提供了以下功能:
在运行时构造任意一个类的对象。
在运行时获取或者修改任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法(属性)。
获取Class对象的三种方式
1.通过类名获取 类名.class
⒉通过对象获取 对象名.getclass()
3.通过全类名获取 Class.forName(全类名)/classLoader.loadClass(全类名)
通过反射来生成对象主要有两种方式
1.使用Class对象的newInstance()方法来创建Class对象对应类的实例。
2.先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例。
得到构造器的方法
Constructor getConstructor(Class[] params)-- 获得使用特殊的参数类型的public构造函数(包括父类)
Constructor[] getConstructors() --获得类的所有公共构造函数
Constructor getbeclaredConstructor(Class[] params)--获得使用特定参数类型的构造函数(包括私有)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
获得字段信息的方法
Field getField(String name) --获得命名的公共字段
Field[] getFields() --获得类的所有公共字段
Field getDeclaredField(string name)--获得类声明的命名的字段
Field[] getDeclaredFields() --获得类声明的所有字段
获得方法信息的方法
Method getMethod(String name,class[] params)--使用特定的参数类型,获得命名的公共方法
Method[ ] getMethods() --获得类的所有公共方法
Method getDeclaredMethod(String name,/class[] params)--使用特写的参数类型,获得类声明的命名的方法
Method[ ] getDeclaredMethods()-获得类声明的所有方法
反射获取泛型真实类型
当我们对一个泛型类进行反射时,需要的到泛型中的真实数据类型,来完成如json反序列化的操作。此时需要通过Type体系来完成。Type接口包含了一个实现类(Class)和四个实现接口,他们分别是:
TypeVariable 泛型类型变量。可以泛型上下限等信息
ParameterizedType 具体的泛型类型,可以获得元数据中泛型签名类型(泛型真实类型)
GenericArrayType 当需要描述的类型是泛型类的数组时,比如List,Map[],此接口会作为Type的实现
wildcardType 通配符泛型,获得上下限信息