DriverManager.getConnection一共有四个重载方法,前三个由public修饰,用来获取不同类型的参数,这三个getConnection实际相当于一个入口,他们最终都会return第四个私有化的getConnection方法,最终向第四个私有化方法的传入参数都是url,java.util.Properties,以及Reflection.getCallerClass(),这个方法是native的
其中Reflection.getCallerClass()是反射中的一个方法,这个方法用来返回他的调用类,也就说是哪个类调用了这个方法,Reflection类位于调用栈中的0帧位置,在JDK7以前,该方法可以传入int n返回调用栈中从0帧开始的第n帧中的类,在JDK7中,需要设置java命令行选项Djdk.reflect.allowGetCallerClass来使用该方法,到了JDK8时,再调用该方法会导致UnsupportedOperationException异常。
JDK8中getCallerClass使用方法变更为getCallerClass(),Reflection.getCallerClass()方法调用所在的方法必须用@CallerSensitive进行注解,通过此方法获取class时会跳过链路上所有的有@CallerSensitive注解的方法的类,直到遇到第一个未使用该注解的类,避免了用Reflection.getCallerClass(int n) 这个过时方法来自己做判断。
在这里每个getConnection都是用CallerSensitive修饰的,调用getCallerClass应该是获取外面使用DriverManager.getConnection()的类的名称,即在class A中调用了DriverManage