--- old/src/java.desktop/share/classes/javax/imageio/metadata/IIOMetadata.java 2016-07-22 11:53:29.070419010 -0700 +++ new/src/java.desktop/share/classes/javax/imageio/metadata/IIOMetadata.java 2016-07-22 11:53:28.922419012 -0700 @@ -414,14 +414,23 @@ } } + // If updating this method also see the same in ImageReaderWriterSpi.java private Class getMetadataFormatClass(String formatClassName) { Module thisModule = IIOMetadata.class.getModule(); Module targetModule = this.getClass().getModule(); - Class c = Class.forName(targetModule, formatClassName); + Class c = null; + try { + ClassLoader cl = this.getClass().getClassLoader(); + c = Class.forName(formatClassName, false, cl); + if (!IIOMetadataFormat.class.isAssignableFrom(c)) { + return null; + } + } catch (ClassNotFoundException e) { + } if (thisModule.equals(targetModule) || c == null) { return c; } - if (thisModule.isNamed()) { + if (targetModule.isNamed()) { int i = formatClassName.lastIndexOf("."); String pn = i > 0 ? formatClassName.substring(0, i) : ""; if (!targetModule.isExported(pn, thisModule)) { --- old/src/java.desktop/share/classes/javax/imageio/spi/ImageReaderWriterSpi.java 2016-07-22 11:53:29.442419004 -0700 +++ new/src/java.desktop/share/classes/javax/imageio/spi/ImageReaderWriterSpi.java 2016-07-22 11:53:29.302419006 -0700 @@ -604,14 +604,23 @@ } } + // If updating this method also see the same in IIOMetadata.java private Class getMetadataFormatClass(String formatClassName) { Module thisModule = ImageReaderWriterSpi.class.getModule(); Module targetModule = this.getClass().getModule(); - Class c = Class.forName(targetModule, formatClassName); + Class c = null; + try { + ClassLoader cl = this.getClass().getClassLoader(); + c = Class.forName(formatClassName, false, cl); + if (!IIOMetadataFormat.class.isAssignableFrom(c)) { + return null; + } + } catch (ClassNotFoundException e) { + } if (thisModule.equals(targetModule) || c == null) { return c; } - if (thisModule.isNamed()) { + if (targetModule.isNamed()) { int i = formatClassName.lastIndexOf("."); String pn = i > 0 ? formatClassName.substring(0, i) : ""; if (!targetModule.isExported(pn, thisModule)) { --- old/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh 2016-07-22 11:53:29.838418997 -0700 +++ new/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh 2016-07-22 11:53:29.670419000 -0700 @@ -22,7 +22,7 @@ # # @test -# @bug 8081729 +# @bug 8081729 8140314 # @summary Test external plugin as classpath jar and as a modular jar. # Test both cases with and without a security manager.