mybatis 在type表达式中,如果是内部类,不能通过 Class.InnerClass 指定,需要通过 Class$InnerClass 指定,不然会报ClassNotFound。
错误堆栈
Caused by: java.lang.ClassNotFoundException: Cannot find class: Class.InnerClass
at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:200)
at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89)
at org.apache.ibatis.io.Resources.classForName(Resources.java:261)
at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:116)
... 104 common frames omitted
具体的产生原因通过报错信息,发现是org.apache.ibatis.type.TypeAliasRegistry#resolveAlias
方法抛出的异常
通过继续往里面走,发现是org.apache.ibatis.io.ClassLoaderWrapper#classForName(java.lang.String, java.lang.ClassLoader[])
方法内部使用java.lang.Class#forName
加载的类,
而Java的内部类在编译之后,都会以Class$InnerClass
的形式进行保存字节码文件,所以说为什么使用 .
会抛出ClassNotFound,因为mybatis最终底层还是使用的Java提供的类加载工具进行累的加载的。
通过对内部类进行javac
我们可以看到一个类编译之后的状态。