Package org.apache.jorphan.reflect

# Class ClassFinder

java.lang.Object
org.apache.jorphan.reflect.ClassFinder

public final class ClassFinder extends Object
This class finds classes that extend one of a set of parent classes.

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static interface`
  `ClassFinder.Closeable`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `JMETER_SKIP_CLASS_SCANNING_ATTRIBUTE`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static List<String>`
  `findAnnotatedClasses(String[] strPathsOrJars, Class<? extends Annotation>[] annotations)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findAnnotatedClasses(String[] strPathsOrJars, Class<? extends Annotation>[] annotations, boolean innerClasses)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findClasses(String[] searchPathsOrJars, ClassFilter filter)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findClassesThatExtend(String[] paths, Class<?>[] superClasses)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findClassesThatExtend(String[] strPathsOrJars, Class<?>[] superClasses, boolean innerClasses)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findClassesThatExtend(String[] strPathsOrJars, Class<?>[] superClasses, boolean innerClasses, String contains, String notContains)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static List<String>`
  `findClassesThatExtend(String[] searchPathsOrJars, Class<?>[] classNames, boolean innerClasses, String contains, String notContains, boolean annotations)`
  Deprecated.
  use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
  `static boolean`
  `getSkipJarsWithJmeterSkipClassScanningAttribute()`
  `static <S> Collection<S>`
  `loadServices(Class<S> service, ServiceLoader<S> serviceLoader, ServiceLoadExceptionHandler<? super S> exceptionHandler)`
  Loads services implementing a given interface.
  `static ClassFinder.Closeable`
  `skipJarsWithJmeterSkipClassScanningAttribute()`
  Configures if `ClassFinder` should skip jar files that have `JMeter-Skip-Class-Scanning: true` manifest attribute.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### JMETER_SKIP_CLASS_SCANNING_ATTRIBUTE

    public static final String JMETER_SKIP_CLASS_SCANNING_ATTRIBUTE
    See Also:
      - Constant Field Values

- ## Method Details

  - ### getSkipJarsWithJmeterSkipClassScanningAttribute

    @API(status=EXPERIMENTAL, since="5.6") public static boolean getSkipJarsWithJmeterSkipClassScanningAttribute()

  - ### skipJarsWithJmeterSkipClassScanningAttribute

    @API(status=INTERNAL, since="5.6") public static ClassFinder.Closeable skipJarsWithJmeterSkipClassScanningAttribute()
    Configures if `ClassFinder` should skip jar files that have `JMeter-Skip-Class-Scanning: true` manifest attribute. JMeter will skip such jars when it uses both `ServiceLoader` and `ClassFinder`. However, `ClassFinder` was public, so it was possible that custom plugins could use it, and they should be able to find the implementations even if they are in jars with `JMeter-Skip-Class-Scanning: true`.

    Sample usage:

         List<String> classNames;
         try (ClassFinder.Closeable ignored = ClassFinder.skipJarsWithJmeterSkipClassScanningAttribute()) {
           // findClassesThatExtend will not skip jars with JMeter-Skip-Class-Scanning: true manifest attribute
           classNames = ClassFinder.findClassesThatExtend(...);

    Returns:
      closeable that will reset "skip jar files with manifest entry" flag when closed. Use it in try-with-resources

  - ### loadServices

    public static <S> Collection<S> loadServices(Class<S> service, ServiceLoader<S> serviceLoader, ServiceLoadExceptionHandler<? super S> exceptionHandler)
    Loads services implementing a given interface. This is an intended replacement for `findClassesThatExtend`.
    Type Parameters:
      `S` - type of service (class or interface)
    Parameters:
      `service` - interface that services should extend.
      `serviceLoader` - ServiceLoader to fetch services.
      `exceptionHandler` - exception handler to use for services that fail to load.
    Returns:
      collection of services that load successfully

  - ### findClassesThatExtend

    @Deprecated public static List<String> findClassesThatExtend(String[] paths, Class<?>[] superClasses) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Convenience method for `findClassesThatExtend(String[], Class[], boolean)` with the option to include inner classes in the search set to false.
    Parameters:
      `paths` - pathnames or jarfiles to search for classes
      `superClasses` - required parent class(es)
    Returns:
      List of Strings containing discovered class names.
    Throws:
      `IOException` - when scanning the classes fails

  - ### findClassesThatExtend

    @Deprecated public static List<String> findClassesThatExtend(String[] strPathsOrJars, Class<?>[] superClasses, boolean innerClasses) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find classes in the provided path(s)/jar(s) that extend the class(es).
    Parameters:
      `strPathsOrJars` - pathnames or jarfiles to search for classes
      `superClasses` - required parent class(es)
      `innerClasses` - should we include inner classes?
    Returns:
      List containing discovered classes
    Throws:
      `IOException` - when scanning for classes fails

  - ### findClassesThatExtend

    @API(status=DEPRECATED, since="5.6") @Deprecated public static List<String> findClassesThatExtend(String[] strPathsOrJars, Class<?>[] superClasses, boolean innerClasses, String contains, String notContains) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find classes in the provided path(s)/jar(s) that extend the class(es).
    Parameters:
      `strPathsOrJars` - pathnames or jarfiles to search for classes
      `superClasses` - required parent class(es)
      `innerClasses` - should we include inner classes?
      `contains` - classname should contain this string
      `notContains` - classname should not contain this string
    Returns:
      List containing discovered classes
    Throws:
      `IOException` - when scanning classes fails

  - ### findAnnotatedClasses

    @API(status=DEPRECATED, since="5.6") @Deprecated public static List<String> findAnnotatedClasses(String[] strPathsOrJars, Class<? extends Annotation>[] annotations, boolean innerClasses) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find classes in the provided path(s)/jar(s) that extend the class(es).
    Parameters:
      `strPathsOrJars` - pathnames or jarfiles to search for classes
      `annotations` - required annotations
      `innerClasses` - should we include inner classes?
    Returns:
      List containing discovered classes
    Throws:
      `IOException` - when scanning classes fails

  - ### findAnnotatedClasses

    @API(status=DEPRECATED, since="5.6") @Deprecated public static List<String> findAnnotatedClasses(String[] strPathsOrJars, Class<? extends Annotation>[] annotations) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find classes in the provided path(s)/jar(s) that extend the class(es). Inner classes are not searched.
    Parameters:
      `strPathsOrJars` - pathnames or jarfiles to search for classes
      `annotations` - required annotations
    Returns:
      List containing discovered classes
    Throws:
      `IOException` - when scanning classes fails

  - ### findClassesThatExtend

    @API(status=DEPRECATED, since="5.6") @Deprecated public static List<String> findClassesThatExtend(String[] searchPathsOrJars, Class<?>[] classNames, boolean innerClasses, String contains, String notContains, boolean annotations) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find classes in the provided path(s)/jar(s) that extend the class(es).
    Parameters:
      `searchPathsOrJars` - pathnames or jarfiles to search for classes
      `classNames` - required parent class(es) or annotations
      `innerClasses` - should we include inner classes?
      `contains` - classname should contain this string
      `notContains` - classname should not contain this string
      `annotations` - true if classnames are annotations
    Returns:
      List containing discovered classes
    Throws:
      `IOException` - when scanning classes fails

  - ### findClasses

    @API(status=DEPRECATED, since="5.6") @Deprecated public static List<String> findClasses(String[] searchPathsOrJars, ClassFilter filter) throws IOException
    Deprecated.
    use `loadServices(Class, ServiceLoader, ServiceLoadExceptionHandler)` or `JMeterUtils#loadServicesAndScanJars`
    Find all classes in the given jars that passes the class filter.
    Parameters:
      `searchPathsOrJars` - list of strings representing the jar locations
      `filter` - `ClassFilter` that the classes in the jars should conform to
    Returns:
      list of all classes in the jars, that conform to `filter`
    Throws:
      `IOException` - when reading the jar files fails