不同jar包相同同名类--Classloader.getResource--slf4j原理

本文介绍了Java中如何通过Class对象定位文件资源,并演示了使用Class对象定位特定类文件的过程。此外,还详细解释了Slf4j在实现日志接口时的工作原理及常见异常的原因。

以下是代码实验

public class Test {

    public static void main(String[] args) throws Exception{

        //当前Test类所在目录(包)的a.txt
       System.out.println(Test.class.getResource("a.txt"));
        //当前项目的根目录的a.txt
      System.out.println(Test.class.getResource("/a.txt"));

        ClassLoader classLoader = Test.class.getClassLoader();
        //从classpath(包括项目路径)查找[java/lang/Byte.class],可以在项目自建同名类java/lang/Byte,实验
        Enumeration<URL> paths  = classLoader.getResources("java/lang/Byte.class");
        while (paths.hasMoreElements()){
            //在idea编辑器如果输出两次同路径rt.jar!/java/lang/Byte.class,是因为执行是把rt.jar的路径在classpath又添加了一次
            //查看idea的run输出框的第一行执行的命令与参数,java -classpath "***rt.jar***"
            System.out.println(paths.nextElement());
        }
    }
}

所以使用 classLoader.getResources 可以知道当前项目的类库中是否有某个类
slf4j查找实现日志接口的库(log4j,logback等待)的方法

从 LoggerFactory.getLogger(Test.class); 开始追代码,会看到LoggerFactory的【bind()】方法调用【findPossibleStaticLoggerBinderPathSet】方法内查找STATIC_LOGGER_BINDER_PATH类的实现

所以常见的异常就可以理解了
1. Defaulting to no-operation (NOP) logger implementation 未找到实现类
2. Class path contains multiple SLF4J bindings. 找到多个实现类(同时加载了log4j和logback等等)

拓展:加载自定义类

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值