反射机制学习总结
反射在底层的框架用到的比较多,每个公司的业务的框架的维护,都会用到反射来加载。
一、先来说一下Class类
1、 注意C是大写,它是一个类
(1):Class可以看成某一个对象照镜子之后看到的信息,它可以看到这个对象的成员变量,成员方法,构造方法,实现了哪些接口等信息。
(2):Class是一个类,是一个描述类的一个类
(3): 一个类在 JVM 中只会有一个Class实例
(4):这个Class实例只能由系统建立
2、 一个类为什么要反射然后产生一个对应的Class类呢。
有时候需要获取某个类的属性或者方法,但这个类并没有被实例化,只有类的全类名,此时可以利用反射机制来完成获取功能
获取Class的3中方式:
(1):直接通过类名.class 的方式获取,该方法最为安全可靠,程序性能更高
Class class1 =Person.class;
(2): 通过对象调用.getClass()来获取(此时需要实例化的对象。用的少)
比如传过来一个Object类,不知道具体是什么类,然后,object.getClass()
(3): 通过全类名的方式获取
Class.forName(“全类名”); 它会默认调用类的无参数的构造器
通过全类名得到类的对象,,然后用newInstance()方法创建类的实例
注意:在定义一个类的时候,有参数的构造器是为了传递参数、实例化对象,而无参构造器则基本是为了让反射机制调用,所以一般定义对象时,声明了有参构造器时,一定要声明一个无参构造器。
3、Class类常用的方法
方法名 | 功能说明 |
static Class forName(String name) | 返回指定类名 name 的 Class 对象 |
Object newInstance() | 调用缺省构造函数,返回该Class对象的一个实例 |
Object newInstance(Object []args) | 调用当前格式构造函数,返回该Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类、接口、数组类、 基本类型或void)名称 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class [] getInterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Class getSuperclass() | 返回表示此Class所表示的实体的超类的Class |
二、接下来我们来介绍反射
1、 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
Ø 在运行时构造任意一个类的对象
Ø 在运行时获取任意一个类所具有的成员变量和方法
Ø 在运行时调用任意一个对象的方法(属性)
Ø 生成动态代理
2介绍Method、它对应类中的方法
2.1 如何获取Method
1)、getDeclaredMethods:得到Method数组
2)、getDeclaredMethod(StringmethodName, Class… paramsTypes)
2.2如何调用Method
1)、当方法为Private时,需要先调用setAccessible(true)使其变为可访问
2)、method.invoke(obj,Object… args);执行方法
3、 关于Field:
3.1、如何获取Field,getField(String fieldName)
3.2、如何获取Field的值
setAccessible(true);
field.get(object obj)
3.3、如何设置Field的值
Field.set(Objectobj, object val)
4、 了解Constructor和Annotation(略)
5、 反射和泛型(略)