JDK8升级至JDK11
存在的public class无法访问
情景:原来JDK8中引用com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl,到了JDK11发现编译报错提示
package com.sun.org.apache.xerces.internal.jaxp.datatype is not visible [ERROR] (package com.sun.org.apache.xerces.internal.jaxp.datatype is declared in module java.xml, which does not export it)
于是开始关于自JDK9引入module概念的了解。详情参照[传送门][1]
原来自JDK9开始后,增加了更加严格的访问机制,引用资料的话来说module is package of Java Packages.
回到问题本身,XMLGregorianCalendarImpl来自JDK jrt-fs.jar->java.xml,其根目录下的module-info.java声明如下:
并没有出现exports com.sun.org.apache.xerces.internal.jaxp.datatype
所以就有了明明XMLGregorianCalendarImpl的访问权限是public,但仍然无法访问的问题。
解决问题:
既然XMLGregorianCalendarImpl现在已经无法通过外接直接访问,我猜可能通过某种包装后再进行暴露
发现XMLGregorianCalendarImpl被com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar()调用
DatatypeFactoryImpl被javax.xml.datatype.DatatypeFactory.newFaultInstance()调用。
然后再看看javax.xml.datatype是否在module-info.java中有暴露出去
所以通过DatatypeFactory.newFaultInstance().newXMLGregorianCalendar()得到XMLGregorianCalendarImpl