Class SPIClassIterator<S>

  • All Implemented Interfaces:
    java.util.Iterator<java.lang.Class<? extends S>>

    public final class SPIClassIterator<S>
    extends java.lang.Object
    implements java.util.Iterator<java.lang.Class<? extends S>>
    Helper class for loading SPI classes from classpath (META-INF files). This is a light impl of ServiceLoader but is guaranteed to be bug-free regarding classpath order and does not instantiate or initialize the classes found.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.Class<S> clazz  
      private java.util.Iterator<java.lang.String> linesIterator  
      private java.lang.ClassLoader loader  
      private static java.lang.String META_INF_SERVICES  
      private java.util.Enumeration<java.net.URL> profilesEnum  
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private SPIClassIterator​(java.lang.Class<S> clazz, java.lang.ClassLoader loader)  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      static <S> SPIClassIterator<S> get​(java.lang.Class<S> clazz)
      Creates a new SPI iterator to lookup services of type clazz using the same ClassLoader as the argument.
      static <S> SPIClassIterator<S> get​(java.lang.Class<S> clazz, java.lang.ClassLoader loader)
      Creates a new SPI iterator to lookup services of type clazz using the given classloader.
      boolean hasNext()  
      static boolean isParentClassLoader​(java.lang.ClassLoader parent, java.lang.ClassLoader child)
      Utility method to check if some class loader is a (grand-)parent of or the same as another one.
      private boolean loadNextProfile()  
      java.lang.Class<? extends S> next()  
      void remove()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • Methods inherited from interface java.util.Iterator

        forEachRemaining
    • Field Detail

      • META_INF_SERVICES

        private static final java.lang.String META_INF_SERVICES
        See Also:
        Constant Field Values
      • clazz

        private final java.lang.Class<S> clazz
      • loader

        private final java.lang.ClassLoader loader
      • profilesEnum

        private final java.util.Enumeration<java.net.URL> profilesEnum
      • linesIterator

        private java.util.Iterator<java.lang.String> linesIterator
    • Constructor Detail

      • SPIClassIterator

        private SPIClassIterator​(java.lang.Class<S> clazz,
                                 java.lang.ClassLoader loader)
    • Method Detail

      • get

        public static <S> SPIClassIterator<S> get​(java.lang.Class<S> clazz)
        Creates a new SPI iterator to lookup services of type clazz using the same ClassLoader as the argument.
      • get

        public static <S> SPIClassIterator<S> get​(java.lang.Class<S> clazz,
                                                  java.lang.ClassLoader loader)
        Creates a new SPI iterator to lookup services of type clazz using the given classloader.
      • isParentClassLoader

        public static boolean isParentClassLoader​(java.lang.ClassLoader parent,
                                                  java.lang.ClassLoader child)
        Utility method to check if some class loader is a (grand-)parent of or the same as another one. This means the child will be able to load all classes from the parent, too.

        If caller's codesource doesn't have enough permissions to do the check, false is returned (this is fine, because if we get a SecurityException it is for sure no parent).

      • loadNextProfile

        private boolean loadNextProfile()
      • hasNext

        public boolean hasNext()
        Specified by:
        hasNext in interface java.util.Iterator<S>
      • next

        public java.lang.Class<? extends S> next()
        Specified by:
        next in interface java.util.Iterator<S>
      • remove

        public void remove()
        Specified by:
        remove in interface java.util.Iterator<S>