- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
常见的三种类加载方式如下:
TransactionMain transactionMain = new TransactionMain();
Class<?> aClass = Class.forName(TransactionMain.class.getName());
ClassLoader.getSystemClassLoader().loadClass(TransactionMain.class.getName());
那么下面抛出问题: 这三种加载方式有什么不同?
要回答上面这个问题,我们先来看看一个java.class文件从磁盘被加载到内存要经历那些步骤吧。
加载阶段就是将class文件从磁盘加载到内存中,并生成该class文件对应的class对象
连接阶段包含三个小步骤:
验证: 确保Class文件的字节流中包含的信息符合Java虚拟机规范,进行文件格式,元数据,字节码和符号引用验证等
准备: 为类中的静态变量分配内存并设置为当前数据类型的零值,例如: static int a=10 ,但是这里只会赋予零值,即a=0
解析: 将常量池内的符号引用替换为直接引用
初始化: 执行类构造器中的代码,这里类构造器client方法是编译器自动收集类中的所有静态变量的赋值动作和静态语句块中的语句合并而成的,在这里a会被赋值为10。
还有一点: 前两种方式都是静态加载,而最后一种方式是动态加载
new关键字和newInstance()方法的区别:
newInstance:弱类型,低效率,只能调用无参构造;
new:强类型,相对高效,能调用任何Public构造。
Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)。上面也已经讲过一遍了。
Class.forName(className)
实际上是调用Class.forName(className, true, this.getClass().getClassLoader())
。
第二个参数,是指Class被loading后是不是必须被初始化。
ClassLoader.loadClass(className)
实际上调用的是ClassLoader.loadClass(name, false)
。
第二个参数指Class是否被link
Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
例如,在JDBC编程中,常看到这样的用法:
Class.forName(“com.mysql.jdbc.Driver”)
如果换成了下面这样就不行了
getClass().getClassLoader().loadClass(“com.mysql.jdbc.Driver”)
因为Driver的静态代码块中需要在初始化的时候被执行,这样才可以向DriverManager去注册自己
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
我正在为我的项目使用 Google Cloud Datastore(而非 NDB)。 python2.7 和 Django。 我想创建一个新模型,比如说 Tag 模型。 class Tag(db.Mo
我正在研究使用 monad 推导式来表示 SQL 查询,并生成适当的 SQL。乍一看,这不是问题,看起来很合适。但我必须限制类型,这些类型只能形成产品的单子(monad),而不是总和,而且我想不出一种
在Foldable文档,我看到以下实例: (Foldable f, Foldable g) => Foldable (Compose * * f g) 如果我查看 Compose 的定义,我看到它被声
给定一个团队->运动员关系并查询所有运动员。什么 我对fetch="Join"有误解吗?该映射是否应引起 通过联接加载团队?在对运动员进行迭代时 仍然懒惰地加载团队。 public class Ath
我才刚刚开始熟悉类型的概念,所以如果我没有很好地表达我的问题,请耐心等待...... 值有类型: 3 :: Int [1,2,3] :: [Int] ('c',True) :: (Char,Bool)
这里是我在 javascript 中的一个数组,效果很好! _rowData: [ { name: "Most Recent", view: "recentView" }, { nam
我正在尝试绘制 pandas Series用一条线。 这些线产生显示的输出和散点图。 import pandas as pd print(pd.__version__) ... print(type(
我正在使用 gcloud npm 模块。提前致谢。 我尝试了很多,但什么也没得到。 最佳答案 您需要对该实体进行查询并计算结果。 var query = ds.createQuery('EntityK
一些上下文 我对 libclang 不是很熟悉。我只是修改一个使用 the python bindings to libclang 的 vim 插件. 有一个 python 函数接收游标参数。当前 C
我有一个链接到 zlib v1.2.3 的程序,它出现以下错误: deflateEnd error 'no msg' kind: 'Z_DATA_ERROR': -3 该程序已成功处理许多要压缩的不同
我正在尝试通过遵循 the docs 来实现 log4rs .我的目标是将 info!("INFO") 的结果放入文件 requests.log,但出现错误: thread 'main' panick
Program type already present: org.apache.http.ContentTooLongException Message{kind=ERROR, text=Progr
当我执行 ng generate component faqs 时,我无法将新组件添加到我的 Nativescript 项目中它返回错误: Option "entryComponent" is dep
我是一名优秀的程序员,十分优秀!