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

#ifndef __javax_management_Notification__
#define __javax_management_Notification__

#pragma interface

#include <java/util/EventObject.h>
extern "Java"
{
  namespace javax
  {
    namespace management
    {
        class Notification;
    }
  }
}

class javax::management::Notification : public ::java::util::EventObject
{

public:
  Notification(::java::lang::String *, ::java::lang::Object *, jlong);
  Notification(::java::lang::String *, ::java::lang::Object *, jlong, jlong);
  Notification(::java::lang::String *, ::java::lang::Object *, jlong, jlong, ::java::lang::String *);
  Notification(::java::lang::String *, ::java::lang::Object *, jlong, ::java::lang::String *);
  virtual ::java::lang::String * getMessage();
  virtual jlong getSequenceNumber();
  virtual jlong getTimeStamp();
  virtual ::java::lang::String * getType();
  virtual ::java::lang::Object * getUserData();
  virtual void setSequenceNumber(jlong);
  virtual void setSource(::java::lang::Object *);
  virtual void setTimeStamp(jlong);
  virtual void setUserData(::java::lang::Object *);
  virtual ::java::lang::String * toString();
private:
  void writeObject(::java::io::ObjectOutputStream *);
  static const jlong serialVersionUID = -7516092053498031989LL;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::util::EventObject)))) message;
  jlong sequenceNumber;
public: // actually protected
  ::java::lang::Object * source;
private:
  jlong timeStamp;
  ::java::lang::String * type;
  ::java::lang::Object * userData;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_management_Notification__
