Mybatis 语法纠错

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方法抛出的异常

resolveAlias

通过继续往里面走,发现是org.apache.ibatis.io.ClassLoaderWrapper#classForName(java.lang.String, java.lang.ClassLoader[])方法内部使用java.lang.Class#forName加载的类,

classForName

而Java的内部类在编译之后,都会以Class$InnerClass的形式进行保存字节码文件,所以说为什么使用 . 会抛出ClassNotFound,因为mybatis最终底层还是使用的Java提供的类加载工具进行累的加载的。

通过对内部类进行javac 我们可以看到一个类编译之后的状态。
javac