反射

在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种 动态的获取信息 以及 动态调用对象的方法 的功能称为 java 的反射机制

  1. 调用Class类的getDeclaredMethod可以获取指定方法名和参数的方法对象Method
  2. 调用invoke方法

区别

在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName( )方法实际上也是调用的CLassLoader来实现的。

  • Class.forName 是必须将类初始化,static块代码已经被执行,static参数也已经被初始化。
  • ClassLoader.loadClass 并没有对类进行初始化,只是把类加载到了虚拟机中。目标对象被装载后不进行链接,也就不会去执行该类静态块中间的内容

JDBC时通常是使用Class.forName()方法来加载数据库连接驱动。这是因为在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己(操作写在了静态代码块中)。

反射原理:

https://www.jianshu.com/p/3ea4a6b57f87

反射使用:

https://www.jianshu.com/p/9be58ee20dee

https://juejin.im/post/598ea9116fb9a03c335a99a4