类加载器如何加载项目中相同的类

最近在面试中遇到一道问题,把我问得有点蒙蔽。这个问题是这样的,现在有一个WAR包,我们定义了一个类A,然后这个WAR包引用了一个JAR包,也有一个类A,两个类A全限定名相同,那么虚拟机会加载哪一个类呢?

OK,遇到这个问题的第一感觉,在Java项目中能够存在两个相同的全类名的类吗,结果在线下实现了一下,确实可以。

我自己通过maven打了一个jar包。全限定名为test.lang.Person。然后项目引用了这个jar包。

在引用的jar包中类的静态代码块儿中写了 init from jar. 

然后又在项目中定义了一个java.lang.Person。同时在类中的静态代码块儿中也写了一行代码 init from project

然后运行代码。

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        Class cls = person.getClass();
        ClassLoader classLoader = cls.getClassLoader();
        System.out.println(classLoader);
    }

}

结果出来是,是加载的在项目中定义的类A。

随后我将项目中的类A去掉, 只保留jar包中的类A,结果可想而知。虚拟机是从jar包中加载的类A

那么为什么会这样呢?其实这个问题,我们可以直接进入ClassLoader的代码找到答案。上面可以看到,实际加载这个类的类加载器就是AppClassL

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当Tomcat部署Web项目时,可能会出现加载冲突的问题。类加载器Java虚拟机的一个重要组成部分,它负责将加载到内存。Tomcat使用了多个类加载器,每个Web应用程序都有自己的类加载器。当两个Web应用程序使用相同时,可能会出现加载冲突的问题。 解决加载冲突的方法有以下几种: 1.使用不同的类加载器加载相同。可以通过在Web应用程序的WEB-INF目录下创建lib目录,并将应用程序所需的所有文件放在该目录下,从而使用Web应用程序的类加载器加载这些。 2.使用父类加载器加载相同。可以通过在Tomcat的catalina.properties文件设置common.loader属性,将应用程序所需的所有文件放在该属性所指定的目录下,从而使用父类加载器加载这些。 3.使用Java加载机制。可以通过在应用程序的MANIFEST.MF文件设置Class-Path属性,将应用程序所需的所有文件放在该属性所指定的目录下,从而使用Java加载机制加载这些。 下面是一个使用不同的类加载器加载相同的例子: ```java // 在Web应用程序A的servlet加载 ClassLoader classLoaderA = this.getClass().getClassLoader(); Class<?> classA = classLoaderA.loadClass("com.example.MyClass"); // 在Web应用程序B的servlet加载 ClassLoader classLoaderB = this.getClass().getClassLoader(); Class<?> classB = classLoaderB.loadClass("com.example.MyClass"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值