Java反射机制
目标
1.理解Class类
2.理解Java的类加载机制
3.学会使用ClassLoader进行加载
4.理解反射机制
5.掌握Constructor、Method、Field
6.理解并掌握动态代理
介绍
说实话反射用在编程语言中确实让人很难理解也很抽象。可以这么理解:为了能够动态(运行期)获得类的信息,因此java提供了反射机制。
Java正因为拥有反射机制所以说Java具备动态语言的特性,此动态非动态语言的动态特性。
所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。
每个类在JVM中都有且只有一个Class实例对象
方法介绍和使用
获得类对应的Class对象的三种方式
//1、通过Class.forName(全限定名)
Class clazz1 = Class.forName("com.xuyi.usemaven.javase.ref.User");
//2、通过类的class属性获取
Class clazz2 = User.class;
//3、通过实例对象的getClass()方法获取
User user = new User();
Class clazz3 = user.getClass();
//备注:以上三种获取Class对象方式中,第一种方式是使用最多的,反射的目的就是为了动态获取,后面两种方式没有体现动态的特性。
Class.forName方式通常除了加载类通常还会初始化类,当然可以设置是否需要初始化。
Class对象主要方法
获得属性
//获得属性数组
getFields()&getDeclaredFields()
//获得某个具体属性
getField(String name)&getDeclaredField(String name)
获得方法
//获得方法数组
getMethods()&getDeclaredMethods()
//获得某个具体方法
getMethod(String name, Class<?>... parameterTypes)&
getDeclaredMethod(String name, Class<?>... parameterTypes)
获得构造方法
//获得构造方法数组
getConstructors()&getDeclaredConstructors()
//获得某个具体构造方法
getConstructor(Class<?>... parameterTypes)&
getDeclaredConstructor(Class<?>... parameterTypes)
备注:通常有Declared修饰的方法表示可以获得private修饰的属性/方法,无Declared修饰的方法通常表示只能获取public修饰的属性/方法。
备注:通常由private修饰的属性/方法使用前需要调用setAccessible(true),设置访问属性。
总结
JDK的反射机制在日常开发中我们可能遇到和使用的机会并不多,但是很多的框架设计与实现都是基于反射机制来实现的。
基于JDK的动态代理实现就是借助反射机制实现的。
理解反射机制比记住Class类下的方法更重要。