目录

一.什么是Java反射?

二、反射优缺点

三、如何使用反射?

四、spring用到反射的场景


一.什么是Java反射?

        Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

表 1 反射可访问的常用信息

类型

访问方法

返回值类型

说明

包路径

getPackage()

Package 对象

获取该类的存放路径

类名称

getName()

String 对象

获取该类的名称

继承类

getSuperclass()

Class 对象

获取该类继承的类

实现接口

getlnterfaces()

Class 型数组

获取该类实现的所有接口

构造方法

getConstructors()

Constructor 型数组

获取所有权限为 public 的构造方法

getDeclaredContruectors()

Constructor 对象

获取当前对象的所有构造方法

方法

getMethods()

Methods 型数组

获取所有权限为 public 的方法

getDeclaredMethods()

Methods 对象

获取当前对象的所有方法

成员变量

getFields()

Field 型数组

获取所有权限为 public 的成员变量

getDeclareFileds()

Field 对象

获取当前对象的所有成员变量

内部类

getClasses()

Class 型数组

获取所有权限为 public 的内部类

getDeclaredClasses()

Class 型数组

获取所有内部类

内部类的声明类

getDeclaringClass()

Class 对象

如果该类为内部类,则返回它的成员类,否则返回 null

 

二、反射优缺点

优点:

  • 能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
  • 与 Java 动态编译相结合,可以实现无比强大的功能。
  • 对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

缺点:

  • 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
  • 反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。

 

 三、如何使用反射?

 

 

  1. 数据类型.class,如int.class,String.class,任何数据类型都有.class,可以直接调用
  2. 对象.getClass(),如String str=new Stirng(); Class c=str.getClass();
  3. Class.forName("完整类名")
public class demo  {
    public static void main(String[] args) throws ClassNotFoundException {

        //方法1
        Class string = String.class;

        //方法2
        String s = "hello";
        Class string2 = s.getClass();

        //方法3
        Class string3 = Class.forName("java.lang.String");



    }
}

 四、spring用到反射的场景

1.我们在使用JDBC连接数据库时使用class.forName()通过反射加载数据库的驱动程序
2.Spring框架的IOC(动态加载管理Bean)创建对象以及AOP功能都和反射有联系
3.各类注解都是通过反射机制实现