反射中,Class.forName和ClassLoader.loadCalss方法的区别
来源:互联网 发布:纳贝调试软件 编辑:程序博客网 时间:2024/06/08 12:59
反射中Class.forName()和ClassLoader.loadClass()的区别
一 Java类装载过程
装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间; 解析:将常量池中的符号引用转成直接引用; 初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值。
二 分析 Class.forName()和ClassLoader.loadClass
Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true,classloader);第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。 ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false);第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以,不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行
三 数据库链接为什么使用Class.forName(className)
JDBC Driver源码如下,因此使用Class.forName(classname)才能在反射回去类的时候执行static块。
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); }}
0 0
- 反射中,Class.forName和ClassLoader.loadCalss方法的区别
- 反射中,Class.forName和classloader的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- 反射中Class.forName()和ClassLoader.loadClass()的区别
- java反射 ClassLoader 和 Class.forName() 的区别
- java反射——Class.forName和classloader的区别
- java反射中,Class.forName和classloader的区别(代码说话)
- Java中Class.forName()和ClassLoader.loadClass()的区别
- Java中Class.forName和ClassLoader.loadClass的区别
- Java中Class.forName和ClassLoader.loadClass的区别
- Java中Class.forName和ClassLoader.loadClass的区别
- Class.forname() 和 ClassLoader.loadClass()的区别
- Class.forName() 和 ClassLoader.loadClass()的区别?
- NYOJ - 20 - 吝啬的国度(无根树转有根树)
- Shiro源码分析 -- Subject.isPermitted(permission)已登陆用户判断是否具有某权限
- 软件流程图编写软件
- 提高mapreduce性能的七点建议
- javascript是单线程的吗?
- 反射中,Class.forName和ClassLoader.loadCalss方法的区别
- ABAP 固定资产报废的BAPI
- iOS 导航栏创建多个Button
- 《一个菜逼Android的J2EE的心酸路》JavaWeb之JDBC (一)
- PHP二维数组排序函数
- 全球第二大消费性数位板品牌——绘王Huion
- PHP转义字符
- CSDN 如何转载别人的文章
- Linux-重定向输出>和>>