美文网首页
同名类的加载顺序

同名类的加载顺序

作者: hei禹 | 来源:发表于2022-04-23 00:16 被阅读0次

maven在遇到同名类时,加载顺序如何?我们做实验测试下。

出现同名类的情况如下,不同包下的MyApi类完全一样:
1、demo应用依赖了api-v1的MyApi类
2、demo应用依赖了api-v2的MyApi类

api-v1版本的代码如下:

package org.example.api;

/**
 * @author xxx
 * @date 2022/4/22 11:20 下午
 */
public class MyApi {

    public void echo() {
        System.out.println("api-v1");
    }
}

api-v2版本的代码如下:

package org.example.api;

/**
 * @author xxx
 * @date 2022/4/22 11:19 下午
 */
public class MyApi {

    public void echo() {
        System.out.println("api-v2");
    }
}

demo调用如下:

package org.example.demo;

import org.example.api.MyApi;

/**
 * @author xxx
 * @date 2022/4/22 11:22 下午
 */
public class App {

    public static void main(String[] args) {
        MyApi myApi = new MyApi();
        myApi.echo();
    }
}

当pom中的引入顺序是下面这种情况,控制台输出:api-v1:

    <dependencies>
        <dependency>
            <groupId>org.example.api</groupId>
            <artifactId>api-v1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example.api</groupId>
            <artifactId>api-v2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

当pom中的引入顺序是下面这种情况,控制台输出:api-v2:

    <dependencies>
        <dependency>
            <groupId>org.example.api</groupId>
            <artifactId>api-v2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example.api</groupId>
            <artifactId>api-v1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

再做一个实验,在demo工程本地也新建一个同名的MyApi类:

package org.example.api;

/**
 * @author xxx
 * @date 2022/4/22 11:25 下午
 */
public class MyApi {

    public void echo() {
        System.out.println("api-demo");
    }
}

目录结构如下:


image.png

再次执行main函数,控制台输出:api-demo

结论:
1、maven遇到同名类,在pom中先声明的先加载
2、本地类的加载顺序,优先于依赖包中的类

用途:
利用第2点结论的特性,在单元测试中,我们可以新建与依赖包中同名的类,以实现mock。比如,这样可以不依赖中间件进行单测了

相关文章

  • 同名类的加载顺序

    maven在遇到同名类时,加载顺序如何?我们做实验测试下。 出现同名类的情况如下,不同包下的MyApi类完全一样:...

  • JVM类加载入门

    一 类加载顺序 class类加载-->验证-->准备--->解析--->初始化 class类加载:通过类加载器加载...

  • 类的加载过程

    类的加载过程 类文件加载的顺序 1、先加载执行父类的静态变量及静态初始化块(执行先后顺序按排列的先后顺序)2、再加...

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • 类加载顺序

    首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Cla...

  • 类加载顺序

    主要说的是类加载过程中,各种类型的成员变量的加载顺序1.先静态变量,后普通变量。2.new一个类的实例,会先检测是...

  • 类加载顺序

    fa staticsub staticfa {}fa ()sub {}sub ()

  • 类的加载顺序

    1.加载 2.连接 3.初始化 4.使用 5.卸载 连接中 分3个过程:验证、准备、解析。准备阶段会给类变量分配...

  • 类加载的顺序

    面试中经常问到的类初始化的顺序,现在给出个总结然后贴一段代码: 类初始化(注意先父类后子类)1.类的静态变量、静态...

  • 类的加载顺序

    原文链接https://blog.csdn.net/gongzi2311/article/details/3952...

网友评论

      本文标题:同名类的加载顺序

      本文链接:https://www.haomeiwen.com/subject/duvoertx.html