Interface ClassAnalyzer

All Known Implementing Classes:
DefaultClassAnalyzer

@Contract public interface ClassAnalyzer
When HK2 automatically analyzes a class to find the constructor, fields, initializer methods and postConstruct and preDestroy methods it uses this service to analyze the class. This analyzer is only used for descriptors that are not pre-reified and which are not provided by factories.

HK2 will provide a default implementation of this service (with the name "default"). However, individual descriptors may choose a different class analyzer should they so choose. All user supplied implementations of this service must have a name. Implementations of this service must not be ClassAnalyzers for themselves.

The method ServiceLocator.setDefaultClassAnalyzerName(String) can be used to set the global ClassAnalyzer name that will be the name of the ClassAnalyzer used when the method Descriptor.getClassAnalysisName() returns null

Implementations of ClassAnalyzer will be instantiated as soon as they are added to HK2 in order to avoid deadlocks and circular references. Therefore it is recommended that implementations of ClassAnalyzer make liberal use of Provider or IterableProvider when injecting dependent services so that these services are not instantiated when the ClassAnalyzer is created

  • Field Details

    • DEFAULT_IMPLEMENTATION_NAME

      static final String DEFAULT_IMPLEMENTATION_NAME
      The name of the default ClassAnalyzer service
      See Also:
  • Method Details

    • getConstructor

      <T> Constructor<T> getConstructor(Class<T> clazz) throws MultiException, NoSuchMethodException
      Will return the constructor that it to be used when constructing this service

      The default implementation will use the zero-arg constructor if no single constructor with Inject is found. Also will return any constructor that is covered by an InjectionResolver and the InjectionResolver.isConstructorParameterIndicator() is set to true

      Parameters:
      clazz - the non-null class to analyze
      Returns:
      The non-null constructor to use for creating this service
      Throws:
      MultiException - on an error when analyzing the class
      NoSuchMethodException - if there was no available constructor
    • getInitializerMethods

      <T> Set<Method> getInitializerMethods(Class<T> clazz) throws MultiException
      Will return the set of initializer method to be used when initializing this service

      The default implementation will return all methods marked with Inject or that have a parameter that is covered by an InjectionResolver and the InjectionResolver.isMethodParameterIndicator() is set to true. Also, any method that has a parameter marked with SubscribeTo will NOT be returned, as these methods are instead meant to be called when an event is fired

      Parameters:
      clazz - the non-null class to analyze
      Returns:
      A non-null but possibly empty set of initialization methods
      Throws:
      MultiException - on an error when analyzing the class
    • getFields

      <T> Set<Field> getFields(Class<T> clazz) throws MultiException
      Will return the set of initializer fields to be used when initializing this service

      The default implementation will return all fields marked with Inject or that have a parameter that is covered by an InjectionResolver

      Parameters:
      clazz - the non-null class to analyze
      Returns:
      A non-null but possibly empty set of initialization fields
      Throws:
      MultiException - on an error when analyzing the class
    • getPostConstructMethod

      <T> Method getPostConstructMethod(Class<T> clazz) throws MultiException
      Will return the postConstruct method of the class

      The default implementation will return the PostConstruct.postConstruct() method or the method annotated with PostConstruct

      Parameters:
      clazz - the non-null class to analyze
      Returns:
      A possibly null method representing the postConstruct method to call
      Throws:
      MultiException - on an error when analyzing the class
    • getPreDestroyMethod

      <T> Method getPreDestroyMethod(Class<T> clazz) throws MultiException
      Will return the preDestroy method of the class

      The default implementation will return the PreDestroy.preDestroy() method or the method annotated with PreDestroy

      Parameters:
      clazz - the non-null class to analyze
      Returns:
      A possibly null method representing the preDestroy method to call
      Throws:
      MultiException - on an error when analyzing the class