def introspect
      # Set up the attribute data structures; delegates to Propertied.
      init_property_classifiers
      logger.debug { "Introspecting #{qp} metadata..." }
      # check for method conflicts
      conflicts = instance_methods(false) & Resource.instance_methods(false)
      unless conflicts.empty? then
        logger.warn("#{self} methods conflict with #{Resource} methods: #{conflicts.qp}")
      end
      # If this is a Java class rather than interface, then define the Java property
      # attributes.
      if Class === self then
        # the Java attributes defined by this class with both a read and a write method
        pds = property_descriptors(false)
        # Define the standard Java attribute methods.
        pds.each { |pd| define_java_property(pd) }
      end
      logger.debug { "Introspection of #{qp} metadata complete." }
      self
    end
def introspect
      # Set up the attribute data structures; delegates to Propertied.
      init_property_classifiers
      logger.debug { "Introspecting #{qp} metadata..." }
      # check for method conflicts
      conflicts = instance_methods(false) & Resource.instance_methods(false)
      unless conflicts.empty? then
        logger.warn("#{self} methods conflict with #{Resource} methods: #{conflicts.qp}")
      end
      # If this is a Java class rather than interface, then define the Java property
      # attributes.
      if Class === self then
        # the Java attributes defined by this class with both a read and a write method
        pds = property_descriptors(false)
        # Define the standard Java attribute methods.
        pds.each { |pd| define_java_property(pd) }
      end
      logger.debug { "Introspection of #{qp} metadata complete." }
      self
    end
Defines the Java attribute access methods, e.g. +study_protocol+ and +studyProtocol+.
 A boolean attribute is provisioned with an additional reader alias, e.g. +available?+
 for +is_available+.

 Each Java property attribute delegates to the Java attribute getter and setter.
 Each standard attribute delegates to the Java property attribute.
 Redefining these methods results in a call to the redefined method.
 This contrasts with a Ruby alias, where the alias remains bound to the
 original method body.