定义:
反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。在Java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
功能:
在运行时判断任意一个对象所属的类;在运行时创建对象;在运行时判定了任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
Where?
JDBC中有一行代码:Class.forName("com.mysql.jdbc.Driver.class");加载MySQL的驱动类。
还有Hibernate、Struts都是用反射机制实现的。
实现方式:
在Java中实现反射最重要的一步,也是第一步就是获取Class对象,得到Class对象后可以通过该对象调用相应的方法来获取该类中的属性、方法以及调用该类中的方法。
有4中可以得到Class()方法:
1)Class.forName("类的路径");
2)类名.Class
3)对象名.getClass()
4)如果是基本类型的包装类,则可以通过调用包装类的Type属性来获得该包装类的Class对象。
例如:Class<?> clazz = Integer.TYPE;
实现Java反射的类:
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Filed:提供有关类或接口的属性信息,以及对它的动态访问权限。
3)Construction:提供有关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法、属性、构造方法、访问权限)都需要它来实现。
反射机制的优缺点:
优点:
1)能够运行时动态获取类的实例,大大提高程序的灵活性。
2)与Java动态编译相结合,可以实现无比强大的功能。
缺点:
1)使用反射的性能较低。Java反射是要解析字节码,将内存中的对象进行解析。
解决方案:
- 由于JDK的安全检查耗时较多,所以通过setAccessible(true)的方式关闭安全检查来(取消对访问控制修饰符的检查)提升反射速度。
- 需要多次动态创建一个类的实例的时候,有缓存的写法会比没有缓存的写法要快很多;
- ReflectASM工具类,通过字节码生成的方式加快反射速度。
2)使用反射相对来说不安全,破坏了类的封装性,可以通过反射获取这个类的私有方法和属性。