反射面中Class.forName()和ClassLoader.loadClass()的差别

日期:2021-04-05 类型:科技新闻 

关键词:自助建站,专业建站,建站网站,建站平台,网站在线制作app

一 Java类装车全过程

**反射中Class.forName()和ClassLoader.loadClass()的区别-新乡seo|网站优化,网站建设_微信公众号:zeropython—昊天博客

**

装车:根据累的全限制名获得二进制字节数流,将二进制字节数运转换为方式区中的运作时数据信息构造,以内存中转化成Java.lang.class目标;

连接:实行下边的校检、提前准备调解析流程,在其中分析流程是能够挑选的;
校检:查验导进类或插口的二进制数据信息的恰当性;(文档文件格式认证,数据库认证,字节数码认证,标记引入认证)

提前准备:给类的静态数据自变量分派并原始化储存室内空间;
分析:将变量定义池中的标记引入转成立即引入;

原始化:激话类的静态数据自变量的原始化Java编码和静态数据Java编码块,并原始化程序猿设定的自变量值。

二 剖析 Class.forName()和ClassLoader.loadClass

Class.forName(className)方式,內部具体启用的方式是 Class.forName(className,true,classloader);

第二个boolean主要参数表明类是不是必须原始化, Class.forName(className)默认设置是必须原始化。

一旦原始化,便会开启总体目标目标的 static块编码实行,static主要参数也也会被再度原始化。

ClassLoader.loadClass(className)方式,內部具体启用的方式是 ClassLoader.loadClass(className,false);

第二个 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!"); }}