
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_beans_Introspector__
#define __java_beans_Introspector__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace beans
      {
          class BeanInfoEmbryo;
      }
    }
  }
  namespace java
  {
    namespace beans
    {
        class BeanInfo;
        class ExplicitInfo;
        class Introspector;
    }
  }
}

class java::beans::Introspector : public ::java::lang::Object
{

  Introspector();
public:
  static ::java::beans::BeanInfo * getBeanInfo(::java::lang::Class *);
  static ::java::beans::BeanInfo * getBeanInfo(::java::lang::Class *, jint);
  static void flushCaches();
  static void flushFromCaches(::java::lang::Class *);
private:
  static void merge(::gnu::java::beans::BeanInfoEmbryo *, ::java::beans::ExplicitInfo *);
public:
  static ::java::beans::BeanInfo * getBeanInfo(::java::lang::Class *, ::java::lang::Class *);
  static JArray< ::java::lang::String * > * getBeanInfoSearchPath();
  static void setBeanInfoSearchPath(JArray< ::java::lang::String * > *);
  static ::java::lang::String * decapitalize(::java::lang::String *);
public: // actually package-private
  static ::java::beans::BeanInfo * copyBeanInfo(::java::beans::BeanInfo *);
public:
  static const jint USE_ALL_BEANINFO = 1;
  static const jint IGNORE_IMMEDIATE_BEANINFO = 2;
  static const jint IGNORE_ALL_BEANINFO = 3;
public: // actually package-private
  static JArray< ::java::lang::String * > * beanInfoSearchPath;
  static ::java::util::Hashtable * beanInfoCache;
public:
  static ::java::lang::Class class$;
};

#endif // __java_beans_Introspector__
