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

#ifndef __sun_reflect_annotation_AnnotationInvocationHandler__
#define __sun_reflect_annotation_AnnotationInvocationHandler__

#pragma interface

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

extern "Java"
{
  namespace sun
  {
    namespace reflect
    {
      namespace annotation
      {
          class AnnotationInvocationHandler;
      }
    }
  }
}

class sun::reflect::annotation::AnnotationInvocationHandler : public ::java::lang::Object
{

public:
  AnnotationInvocationHandler(::java::lang::Class *, ::java::util::Map *);
  static ::java::lang::annotation::Annotation * create(::java::lang::Class *, ::java::util::Map *);
  jboolean equals(::java::lang::Object *, ::java::lang::Object *);
private:
  static jboolean deepEquals(::java::lang::Object *, ::java::lang::Object *);
  static jint deepHashCode(::java::lang::Object *);
public:
  jint hashCode();
private:
  static ::java::lang::String * deepToString(::java::lang::Object *);
public:
  ::java::lang::String * toString();
private:
  static ::java::lang::Class * getBoxedReturnType(::java::lang::reflect::Method *);
  ::java::lang::Object * coerce(::java::lang::Object *, ::java::lang::Class *);
public:
  ::java::lang::Object * invoke(::java::lang::Object *, ::java::lang::reflect::Method *, JArray< ::java::lang::Object * > *);
private:
  static const jlong serialVersionUID = 6182022883658399397LL;
  ::java::lang::Class * __attribute__((aligned(__alignof__( ::java::lang::Object)))) type;
  ::java::util::Map * memberValues;
public:
  static ::java::lang::Class class$;
};

#endif // __sun_reflect_annotation_AnnotationInvocationHandler__
