@Deprecated
	public <T> List<T> getImplementors (AddOn ao, String packageName, Class<T> classType) {
        Class<?> cls = null;
        List<T> listClass = new ArrayList<>();
        
        List<ClassNameWrapper> classNames;
        if (ao != null) {
        	classNames = this.getJarClassNames(ao, packageName);
        } else {
        	classNames = this.getClassNames(packageName, classType);
        }
        for (ClassNameWrapper classWrapper : classNames) {
            try {
                cls = classWrapper.getCl().loadClass(classWrapper.getClassName());
                // abstract class or interface cannot be constructed.
                if (Modifier.isAbstract(cls.getModifiers()) || Modifier.isInterface(cls.getModifiers())) {
                    continue;
                }
                if (classType.isAssignableFrom(cls)) {
                    @SuppressWarnings("unchecked")
                    Constructor<T> c = (Constructor<T>) cls.getConstructor();
                    listClass.add(c.newInstance());

                }
            } catch (Throwable e) {
            	// Often not an error
            	logger.debug(e.getMessage(), e);
            }
        }
        return listClass;
	}
@ Deprecated public < T > List < T > getImplementors ( AddOn ao , String packageName , Class < T > classType ) { Class < ? > cls = null ; List < T > listClass = new ArrayList < > ( ) ; List < ClassNameWrapper > classNames ; if ( ao != null ) { classNames = this . getJarClassNames ( ao , packageName ) ; } else { classNames = this . getClassNames ( packageName , classType ) ; } for ( ClassNameWrapper classWrapper : classNames ) { try { cls = classWrapper . getCl ( ) . loadClass ( classWrapper . getClassName ( ) ) ; if ( Modifier . isAbstract ( cls . getModifiers ( ) ) || Modifier . isInterface ( cls . getModifiers ( ) ) ) { continue ; } if ( classType . isAssignableFrom ( cls ) ) { @ SuppressWarnings ( "unchecked" ) Constructor < T > c = ( Constructor < T > ) cls . getConstructor ( ) ; listClass . add ( c . newInstance ( ) ) ; } } catch ( Throwable e ) { logger . debug ( e . getMessage ( ) , e ) ; } } return listClass ; }
Gets a list of classes that implement the given type in the given package.
<p>
It searches in the given add-on, if not {@code null}, otherwise it searches in the dependencies, add-ons, and the ZAP
JAR.

@param ao the add-on to search in, might be {@code null}.
@param packageName the name of the package that the classes must be in.
@param classType the type of the classes.
@return a list with the classes that implement the given type, never {@code null}.
@deprecated (TODO add version) The use of this method is discouraged (specially during ZAP startup, as it's delayed),
it's preferable to provide means to register/declare the required classes instead of searching "everywhere".