资料-Java基础:类加载方式及差异

虚拟机加载类的途径
1、由 new 关键字创建一个类的实例
在由运行时刻用 new 方法载入
如:Dog dog = new Dog();
2、调用 Class.forName() 方法
通过反射加载类型,并创建对象实例
如:Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
3、调用某个 ClassLoader 实例的 loadClass() 方法
通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
如:Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();

三者的区别:
1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。另外,1是静态加载,2、3是动态加载

两个异常(exception)
静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常

Class.forName与ClassLoader.loadClass区别
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”),就不行。
com.mysql.jdbc.Driver的源代码如下:
// Register ourselves with the DriverManager
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException(“Can’t register driver!”);
}
}
原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。
所以这个地方就只能用Class.forName(className)。

原文地址:https://www.cnblogs.com/Carrol/p/11538129.html

时间: 2024-10-29 04:42:15

资料-Java基础:类加载方式及差异的相关文章

资料-Java基础:双亲委派模型

什么是Java虚拟机类加载机制? 虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. 类加载的时机 类的生命周期是从类被加载到虚拟机的内存中,到卸载出内存为止. 类的生命周期: 加载 loading 验证 verification 准备 preparation 解析 resolution 初始化 initialization 使用 using 卸载 unloading 参考链接:https://blo

Java 基础 - 比较方式选择(什么类型用equals()比较,什么类型用==比较)

ref: https://www.cnblogs.com/lori/p/8308671.html 在 java 中进行比较,我们需要根据比较的类型来选择合适的比较方式: 对象域,使用 equals 方法 . 类型安全的枚举,使用 equals 或== . 可能为 null 的对象域 : 使用 == 和 equals . 数组域 : 使用 Arrays.equals . 除 float 和 double 外的原始数据类型 : 使用 == . float 类型: 使用 Float.foatToInt

JAVA基础_类加载器

什么是类加载器 类加载器是Java语言在1.0版本就引入的.最初是为了满足JavaApplet需要.现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类加载器进行交互.Java虚拟机默认的行为就已经足够满足大多数情况的需求了.不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时候在ClassNotFoundException和NoClassDefFoundError等异常上. 顾名思义,类加载器是用来加

【转载】Java基础之String中equals,声明方式,等大总结

转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识点还是比较多的.今天就和大家来一起讨论一下,关于String的一些容易让人疑惑的地方,废话不多说进入正题...如有谬误请批评指正,如果有疑问请留言.我会在第一时间修改或回答 通过

Java基础:类加载机制

之前的<java基础:内存模型>当中,我们大体了解了在java当中,不同类型的信息,都存放于java当中哪个部位当中,那么有了对于堆.栈.方法区.的基本理解以后,今天我们来好好剖析一下,java当中的类加载机制(其实就是在美团的二面的时候,被面试官问的懵逼了,特地来总结一下,免得下次再那么丢人 T-T). 我们都知道,在java语言当中,猴子们写的程序,都会首先被编译器编译成为.class文件(又称字节码文件),而这个.class文件(字节码文件)中描述了类的各种信息,字节码文件格式主要分为两

java基础复习之对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

String类型是实际工作中经常用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象可以用new创建,例如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其他类有些特殊,可以使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string"

java 用类加载器的方式管理资源和配置文件

public class ReflectTest {public static void main(String[] args) throws Exception {    //config.properties 与当前类在不同包下:    InputStream is=ReflectTest.class.getResourceAsStream("/com/jhon/copy/config.properties");    //在同一个包下    //InputStream is=Re

java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但是实现Runnable接口可以处理同一个资源. 下面我们做个测试:验证下.车站的售票系统售票的例子,车站的各个售票口相当于各个线程,我们先使用第一种方法几继承Thread类的方式实现: 代码如下: package com.lp.ecjtu.Thread; /** * * @author Admini

Java相关框架资料及其基础资料、进阶资料、测试资料之分享

个人说明:只为分享,不为其他,愿所有的程序员们在编程的世界自由翱翔吧! 在我看来,只有不断实战,不断学习,不断积累,不断归纳总结,形成自己的核心竞争力,方能在未来竞争中脱颖而出! 程序员谨记!重要的事情说三遍! 不断学习!不断学习!不断学习! 不学习等于退步!!! 不学习等于退步!!! 不学习等于退步!!! 黑马最新Java资料及其视频: 链接:https://pan.baidu.com/s/1rQMg81V-mDkk_EZiUQwPtg 密码:190x ssm+shiro权限管理及其相关电子书