最近在学习框架的时候多次遇到了反射这个老朋友,之前虽然学过,但是发现对它的掌握依然不是很好,翻了一书,然后也看了一些博客,有了一些比较形象的认识体会,所以就在这里把这个知识点做一个系统的总结:
1.反射的基本理解
反射时java被视为动态语言的关键。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。对于正在学习的框架中体现的利用反射的便利性有很大的体会。
反射机制主要提供了一下功能:
①在运行时构造任意一个类的对象
②在运行时获取任意一个类所具有的成员变量和方法
③在运行时调用任意一个对象的方法或者属性
④生成动态代理
2.class 对象的三种获取方式
//class 的初始化
Class clazz =null;
①直接通过类名获取
clazz = Person.class;
②通过对象调用的方法获得
Person a =new Person();
clazz=person.getClass();
③通过全类名的方法获得(这个也是使用的最广泛的一个)
clazz=Class.forname("类名");
//使用Class对象的newInstance()方法实例化
//实例化店用的为Person的无参的构造器(也就要求写javabean的时候有无参数的构造函数的存在)
Class<Person> clazz=(Class<Person>)Class.forName("类名");
Object obj=clazz.newInstance();
关于类加载器的一个主要的方法:
InputStream in=null;
in=this.getClass( ).getClassLoader ( ),getResourceAsStream(“test.properities”); //输入文件应放在src的目录下面。
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 |
4.Method(Field) 对象
Class 对象获取 Method 的方法:
getDeclaredMethod(String name, Class<?>... parameterTypes)
getDeclaredMethods()
getMethod(String name, Class<?>... parameterTypes)
getMethods()
Method 对象的方法:
invoke(Object obj, Object... args)、
5.Annotation 相关
获取 Annotation 实例:
getAnnotation(Class<T> annotationClass)
getDeclaredAnnotations()
getParameterAnnotations()
6.泛型相关
泛型类型:ParameterizedType
获取实际的泛型类型参数数组:getActualTypeArguments()