【JavaSE】反射

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Soldier49Zed/article/details/102741356

定义:

反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。在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反射是要解析字节码,将内存中的对象进行解析。

解决方案:

  1. 由于JDK的安全检查耗时较多,所以通过setAccessible(true)的方式关闭安全检查来(取消对访问控制修饰符的检查)提升反射速度。
  2. 需要多次动态创建一个类的实例的时候,有缓存的写法会比没有缓存的写法要快很多;
  3. ReflectASM工具类,通过字节码生成的方式加快反射速度。

2)使用反射相对来说不安全,破坏了类的封装性,可以通过反射获取这个类的私有方法和属性。

猜你喜欢

转载自blog.csdn.net/Soldier49Zed/article/details/102741356