以下是代码实验
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等等)
拓展:加载自定义类