* Removed all Id tags.
[cacao.git] / src / native / vm / gnu / java_lang_reflect_Field.c
index b150381b4b9ff1d10ecf2a5fa1bd71d40fbacbef..261fbfb03ff737c8b6424946c2bad3ebb82fe9ee 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Field.c 7910 2007-05-16 08:02:52Z twisti $
-
 */
 
 
 #include "config.h"
 
 #include <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
 
 #include "native/jni.h"
+#include "native/llni.h"
 #include "native/native.h"
 
 #include "native/include/java_lang_Boolean.h"
 
 #include "native/include/java_lang_reflect_Field.h"
 
+#if defined(ENABLE_ANNOTATIONS)
+#include "native/include/sun_reflect_ConstantPool.h"
+#include "native/vm/reflect.h"
+#endif
+
 #include "vm/access.h"
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/initialize.h"
+#include "vm/primitive.h"
+#include "vm/resolve.h"
 #include "vm/stringlocal.h"
 
 #include "vm/jit/stacktrace.h"
 
 #include "vmcore/loader.h"
-#include "vm/resolve.h"
 #include "vmcore/utf8.h"
 
 
 /* native methods implemented by this file ************************************/
 
 static JNINativeMethod methods[] = {
-       { "getModifiersInternal", "()I",                                     (void *) (ptrint) &Java_java_lang_reflect_Field_getModifiersInternal },
-       { "getType",              "()Ljava/lang/Class;",                     (void *) (ptrint) &Java_java_lang_reflect_Field_getType              },
-       { "get",                  "(Ljava/lang/Object;)Ljava/lang/Object;",  (void *) (ptrint) &Java_java_lang_reflect_Field_get                  },
-       { "getBoolean",           "(Ljava/lang/Object;)Z",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getBoolean           },
-       { "getByte",              "(Ljava/lang/Object;)B",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getByte              },
-       { "getChar",              "(Ljava/lang/Object;)C",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getChar              },
-       { "getShort",             "(Ljava/lang/Object;)S",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getShort             },
-       { "getInt",               "(Ljava/lang/Object;)I",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getInt               },
-       { "getLong",              "(Ljava/lang/Object;)J",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getLong              },
-       { "getFloat",             "(Ljava/lang/Object;)F",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getFloat             },
-       { "getDouble",            "(Ljava/lang/Object;)D",                   (void *) (ptrint) &Java_java_lang_reflect_Field_getDouble            },
-       { "set",                  "(Ljava/lang/Object;Ljava/lang/Object;)V", (void *) (ptrint) &Java_java_lang_reflect_Field_set                  },
-       { "setBoolean",           "(Ljava/lang/Object;Z)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setBoolean           },
-       { "setByte",              "(Ljava/lang/Object;B)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setByte              },
-       { "setChar",              "(Ljava/lang/Object;C)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setChar              },
-       { "setShort",             "(Ljava/lang/Object;S)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setShort             },
-       { "setInt",               "(Ljava/lang/Object;I)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setInt               },
-       { "setLong",              "(Ljava/lang/Object;J)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setLong              },
-       { "setFloat",             "(Ljava/lang/Object;F)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setFloat             },
-       { "setDouble",            "(Ljava/lang/Object;D)V",                  (void *) (ptrint) &Java_java_lang_reflect_Field_setDouble            },
-       { "getSignature",         "()Ljava/lang/String;",                    (void *) (ptrint) &Java_java_lang_reflect_Field_getSignature         },
+       { "getModifiersInternal", "()I",                                     (void *) (intptr_t) &Java_java_lang_reflect_Field_getModifiersInternal },
+       { "getType",              "()Ljava/lang/Class;",                     (void *) (intptr_t) &Java_java_lang_reflect_Field_getType              },
+       { "get",                  "(Ljava/lang/Object;)Ljava/lang/Object;",  (void *) (intptr_t) &Java_java_lang_reflect_Field_get                  },
+       { "getBoolean",           "(Ljava/lang/Object;)Z",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getBoolean           },
+       { "getByte",              "(Ljava/lang/Object;)B",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getByte              },
+       { "getChar",              "(Ljava/lang/Object;)C",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getChar              },
+       { "getShort",             "(Ljava/lang/Object;)S",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getShort             },
+       { "getInt",               "(Ljava/lang/Object;)I",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getInt               },
+       { "getLong",              "(Ljava/lang/Object;)J",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getLong              },
+       { "getFloat",             "(Ljava/lang/Object;)F",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getFloat             },
+       { "getDouble",            "(Ljava/lang/Object;)D",                   (void *) (intptr_t) &Java_java_lang_reflect_Field_getDouble            },
+       { "set",                  "(Ljava/lang/Object;Ljava/lang/Object;)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_set                  },
+       { "setBoolean",           "(Ljava/lang/Object;Z)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setBoolean           },
+       { "setByte",              "(Ljava/lang/Object;B)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setByte              },
+       { "setChar",              "(Ljava/lang/Object;C)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setChar              },
+       { "setShort",             "(Ljava/lang/Object;S)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setShort             },
+       { "setInt",               "(Ljava/lang/Object;I)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setInt               },
+       { "setLong",              "(Ljava/lang/Object;J)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setLong              },
+       { "setFloat",             "(Ljava/lang/Object;F)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setFloat             },
+       { "setDouble",            "(Ljava/lang/Object;D)V",                  (void *) (intptr_t) &Java_java_lang_reflect_Field_setDouble            },
+       { "getSignature",         "()Ljava/lang/String;",                    (void *) (intptr_t) &Java_java_lang_reflect_Field_getSignature         },
+#if defined(ENABLE_ANNOTATIONS)
+       { "declaredAnnotations",  "()Ljava/util/Map;",                       (void *) (intptr_t) &Java_java_lang_reflect_Field_declaredAnnotations  },
+#endif
 };
 
 
@@ -124,22 +131,26 @@ void _Jv_java_lang_reflect_Field_init(void)
 static void *cacao_get_field_address(java_lang_reflect_Field *this,
                                                                         java_lang_Object *o)
 {
-       classinfo        *c;
-       fieldinfo        *f;
+       classinfo *c;
+       fieldinfo *f;
+       int32_t    slot;
+       int32_t    flag;
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* check field access */
        /* check if we should bypass security checks (AccessibleObject) */
 
-       if (this->flag == false) {
+       LLNI_field_get_val(this, flag, flag);
+       if (flag == false) {
                /* this function is always called like this:
 
                           java.lang.reflect.Field.xxx (Native Method)
                   [0] <caller>
                */
-               if (!access_check_member(c, f->flags, 0))
+               if (!access_check_field(f, 0))
                        return NULL;
        }
 
@@ -152,9 +163,9 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this,
                        if (!initialize_class(c))
                                return NULL;
 
-               /* return value address */
+               /* return value pointer */
 
-               return &(f->value);
+               return f->value;
 
        } else {
                /* obj is required for not-static fields */
@@ -164,8 +175,8 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this,
                        return NULL;
                }
        
-               if (builtin_instanceof((java_objectheader *) o, c))
-                       return (void *) ((ptrint) o + f->offset);
+               if (builtin_instanceof((java_handle_t *) o, c))
+                       return (void *) (((intptr_t) o) + f->offset);
        }
 
        /* exception path */
@@ -181,13 +192,15 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this,
  * Method:    getModifiersInternal
  * Signature: ()I
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this)
 {
        classinfo *c;
        fieldinfo *f;
+       int32_t    slot;
 
-       c = (classinfo *) this->declaringClass;
-       f = &(c->fields[this->slot]);
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &(c->fields[slot]);
 
        return f->flags;
 }
@@ -203,9 +216,11 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv *
        classinfo *c;
        typedesc  *desc;
        classinfo *ret;
+       int32_t    slot;
 
-       c    = (classinfo *) this->declaringClass;
-       desc = c->fields[this->slot].parseddesc;
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       desc = c->fields[slot].parseddesc;
 
        if (desc == NULL)
                return NULL;
@@ -213,7 +228,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv *
        if (!resolve_class_from_typedesc(desc, true, false, &ret))
                return NULL;
        
-       return (java_lang_Class *) ret;
+       return LLNI_classinfo_wrap(ret);
 }
 
 
@@ -222,126 +237,55 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv *
  * Method:    get
  * Signature: (Ljava/lang/Object;)Ljava/lang/Object;
  */
-JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *object)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
+       imm_union  value;
+       java_handle_t *o;
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get address of the source field value */
 
-       if ((addr = cacao_get_field_address(this, o)) == NULL)
+       if ((addr = cacao_get_field_address(this, object)) == NULL)
                return NULL;
 
        switch (f->parseddesc->decltype) {
-       case PRIMITIVETYPE_BOOLEAN: {
-               java_lang_Boolean *bo;
-
-               /* create wrapping class */
-
-               if (!(bo = (java_lang_Boolean *) builtin_new(class_java_lang_Boolean)))
-                       return NULL;
-
-               /* set the object value */
-
-               bo->value = *((s4 *) addr);
-
-               /* return the wrapped object */
-
-               return (java_lang_Object *) bo;
-       }
-
-       case PRIMITIVETYPE_BYTE: {
-               java_lang_Byte *bo;
-
-               if (!(bo = (java_lang_Byte *) builtin_new(class_java_lang_Byte)))
-                       return NULL;
-
-               bo->value = *((s4 *) addr);
-
-               return (java_lang_Object *) bo;
-       }
-
-       case PRIMITIVETYPE_CHAR: {
-               java_lang_Character *co;
-
-               if (!(co = (java_lang_Character *) builtin_new(class_java_lang_Character)))
-                       return NULL;
-
-               co->value = *((s4 *) addr);
-
-               return (java_lang_Object *) co;
-       }
-
-       case PRIMITIVETYPE_SHORT: {
-               java_lang_Short *so;
-
-               if (!(so = (java_lang_Short *) builtin_new(class_java_lang_Short)))
-                       return NULL;
-
-               so->value = (s4) *((s4 *) addr);
-
-               return (java_lang_Object *) so;
-       }
-
-       case PRIMITIVETYPE_INT: {
-               java_lang_Integer *io;
-
-               if (!(io = (java_lang_Integer *) builtin_new(class_java_lang_Integer)))
-                       return NULL;
-
-               io->value = *((s4 *) addr);
-
-               return (java_lang_Object *) io;
-       }
-
-       case PRIMITIVETYPE_LONG: {
-               java_lang_Long *lo;
-
-               if (!(lo = (java_lang_Long *) builtin_new(class_java_lang_Long)))
-                       return NULL;
-
-               lo->value = *((s8 *) addr);
-
-               return (java_lang_Object *) lo;
-       }
-
-       case PRIMITIVETYPE_FLOAT: {
-               java_lang_Float *fo;
-
-               if (!(fo = (java_lang_Float *) builtin_new(class_java_lang_Float)))
-                       return NULL;
-
-               fo->value = *((float *) addr);
-
-               return (java_lang_Object *) fo;
-       }
-
-       case PRIMITIVETYPE_DOUBLE: {
-               java_lang_Double *_do;
+       case PRIMITIVETYPE_BOOLEAN:
+       case PRIMITIVETYPE_BYTE:
+       case PRIMITIVETYPE_CHAR:
+       case PRIMITIVETYPE_SHORT:
+       case PRIMITIVETYPE_INT:
+               value.i = *((int32_t *) addr);
+               break;
 
-               if (!(_do = (java_lang_Double *) builtin_new(class_java_lang_Double)))
-                       return NULL;
+       case PRIMITIVETYPE_LONG:
+               value.l = *((int64_t *) addr);
+               break;
 
-               _do->value = *((double *) addr);
+       case PRIMITIVETYPE_FLOAT:
+               value.f = *((float *) addr);
+               break;
 
-               return (java_lang_Object *) _do;
-       }
+       case PRIMITIVETYPE_DOUBLE:
+               value.d = *((double *) addr);
+               break;
 
        case TYPE_ADR:
-               return (java_lang_Object *) *((java_objectheader **) addr);
+#warning this whole thing needs to be inside a critical section!
+               return (java_lang_Object *) *((java_handle_t **) addr);
        }
 
-       /* this must not happen */
-
-       assert(0);
+       /* Now box the primitive types. */
 
-       /* keep compiler happy */
+       o = primitive_box(f->parseddesc->decltype, value);
 
-       return NULL;
+       return (java_lang_Object *) o;
 }
 
 
@@ -350,16 +294,18 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env
  * Method:    getBoolean
  * Signature: (Ljava/lang/Object;)Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -370,7 +316,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_l
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_BOOLEAN:
-               return (s4) *((s4 *) addr);
+               return (int32_t) *((int32_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -383,16 +329,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_l
  * Method:    getByte
  * Signature: (Ljava/lang/Object;)B
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -403,7 +351,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_BYTE:
-               return (s4) *((s4 *) addr);
+               return (int32_t) *((int32_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -416,16 +364,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang
  * Method:    getChar
  * Signature: (Ljava/lang/Object;)C
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -436,7 +386,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_CHAR:
-               return (s4) *((s4 *) addr);
+               return (int32_t) *((int32_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -449,16 +399,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang
  * Method:    getShort
  * Signature: (Ljava/lang/Object;)S
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -470,7 +422,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lan
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_BYTE:
        case PRIMITIVETYPE_SHORT:
-               return (s4) *((s4 *) addr);
+               return (int32_t) *((int32_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -483,16 +435,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lan
  * Method:    getInt
  * Signature: (Ljava/lang/Object;)I
  */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -506,7 +460,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang
        case PRIMITIVETYPE_CHAR:
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               return (s4) *((s4 *) addr);
+               return (int32_t) *((int32_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -519,16 +473,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang
  * Method:    getLong
  * Signature: (Ljava/lang/Object;)J
  */
-JNIEXPORT s8 JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
+JNIEXPORT int64_t JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -542,9 +498,9 @@ JNIEXPORT s8 JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang
        case PRIMITIVETYPE_CHAR:
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               return (s8) *((s4 *) addr);
+               return (int64_t) *((int32_t *) addr);
        case PRIMITIVETYPE_LONG:
-               return (s8) *((s8 *) addr);
+               return (int64_t) *((int64_t *) addr);
        default:
                exceptions_throw_illegalargumentexception();
                return 0;
@@ -562,11 +518,13 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat(JNIEnv *env, java_
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -580,9 +538,9 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat(JNIEnv *env, java_
        case PRIMITIVETYPE_CHAR:
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               return (float) *((s4 *) addr);
+               return (float) *((int32_t *) addr);
        case PRIMITIVETYPE_LONG:
-               return (float) *((s8 *) addr);
+               return (float) *((int64_t *) addr);
        case PRIMITIVETYPE_FLOAT:
                return (float) *((float *) addr);
        default:
@@ -602,11 +560,13 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble(JNIEnv *env , ja
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -620,9 +580,9 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble(JNIEnv *env , ja
        case PRIMITIVETYPE_CHAR:
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               return (double) *((s4 *) addr);
+               return (double) *((int32_t *) addr);
        case PRIMITIVETYPE_LONG:
-               return (double) *((s8 *) addr);
+               return (double) *((int64_t *) addr);
        case PRIMITIVETYPE_FLOAT:
                return (double) *((float *) addr);
        case PRIMITIVETYPE_DOUBLE:
@@ -646,11 +606,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
        fieldinfo *sf;
        fieldinfo *df;
        void      *faddr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       dc = (classinfo *) this->declaringClass;
-       df = &dc->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, dc);
+       LLNI_field_get_val(this, slot , slot);
+       df = &dc->fields[slot];
 
        /* get the address of the destination field */
 
@@ -662,7 +624,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
        if (value == NULL)
                sc = NULL;
        else
-               sc = value->header.vftbl->class;
+               LLNI_class_get(value, sc);
 
        /* The fieldid is used to set the new value, for primitive
           types the value has to be retrieved from the wrapping
@@ -670,7 +632,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
        switch (df->parseddesc->decltype) {
        case PRIMITIVETYPE_BOOLEAN: {
-               s4 val;
+               int32_t val;
 
                /* determine the field to read the value */
 
@@ -679,57 +641,57 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BOOLEAN:
-                       val = ((java_lang_Boolean *) value)->value;
+                       LLNI_field_get_val((java_lang_Boolean *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s4 *) faddr) = val;
+               *((int32_t *) faddr) = val;
                return;
        }
 
        case PRIMITIVETYPE_BYTE: {
-               s4 val;
+               int32_t val;
 
                if ((sc == NULL) || !(sf = class_findfield(sc, utf_value, utf_B)))
                        break;
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                default:        
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s4 *) faddr) = val;
+               *((int32_t *) faddr) = val;
                return;
        }
 
        case PRIMITIVETYPE_CHAR: {
-               s4 val;
+               int32_t val;
 
                if ((sc == NULL) || !(sf = class_findfield(sc, utf_value, utf_C)))
                        break;
                                   
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_CHAR:
-                       val = ((java_lang_Character *) value)->value;
+                       LLNI_field_get_val((java_lang_Character *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s4 *) faddr) = val;
+               *((int32_t *) faddr) = val;
                return;
        }
 
        case PRIMITIVETYPE_SHORT: {
-               s4 val;
+               int32_t val;
 
                /* get field only by name, it can be one of B, S */
 
@@ -738,22 +700,22 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
                                   
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                case PRIMITIVETYPE_SHORT:
-                       val = ((java_lang_Short *) value)->value;
+                       LLNI_field_get_val((java_lang_Short *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s4 *) faddr) = val;
+               *((int32_t *) faddr) = val;
                return;
        }
 
        case PRIMITIVETYPE_INT: {
-               s4 val;
+               int32_t val;
 
                /* get field only by name, it can be one of B, S, C, I */
 
@@ -762,28 +724,28 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                case PRIMITIVETYPE_CHAR:
-                       val = ((java_lang_Character *) value)->value;
+                       LLNI_field_get_val((java_lang_Character *) value, value, val);
                        break;
                case PRIMITIVETYPE_SHORT:
-                       val = ((java_lang_Short *) value)->value;
+                       LLNI_field_get_val((java_lang_Short *) value, value, val);
                        break;
                case PRIMITIVETYPE_INT:
-                       val = ((java_lang_Integer *) value)->value;
+                       LLNI_field_get_val((java_lang_Integer *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s4 *) faddr) = val;
+               *((int32_t *) faddr) = val;
                return;
        }
 
        case PRIMITIVETYPE_LONG: {
-               s8 val;
+               int64_t val;
 
                /* get field only by name, it can be one of B, S, C, I, J */
 
@@ -792,26 +754,26 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                case PRIMITIVETYPE_CHAR:
-                       val = ((java_lang_Character *) value)->value;
+                       LLNI_field_get_val((java_lang_Character *) value, value, val);
                        break;
                case PRIMITIVETYPE_SHORT:
-                       val = ((java_lang_Short *) value)->value;
+                       LLNI_field_get_val((java_lang_Short *) value, value, val);
                        break;
                case PRIMITIVETYPE_INT:
-                       val = ((java_lang_Integer *) value)->value;
+                       LLNI_field_get_val((java_lang_Integer *) value, value, val);
                        break;
                case PRIMITIVETYPE_LONG:
-                       val = ((java_lang_Long *) value)->value;
+                       LLNI_field_get_val((java_lang_Long *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
                        return;
                }
 
-               *((s8 *) faddr) = val;
+               *((int64_t *) faddr) = val;
                return;
        }
 
@@ -825,22 +787,22 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                case PRIMITIVETYPE_CHAR:
-                       val = ((java_lang_Character *) value)->value;
+                       LLNI_field_get_val((java_lang_Character *) value, value, val);
                        break;
                case PRIMITIVETYPE_SHORT:
-                       val = ((java_lang_Short *) value)->value;
+                       LLNI_field_get_val((java_lang_Short *) value, value, val);
                        break;
                case PRIMITIVETYPE_INT:
-                       val = ((java_lang_Integer *) value)->value;
+                       LLNI_field_get_val((java_lang_Integer *) value, value, val);
                        break;
                case PRIMITIVETYPE_LONG:
-                       val = ((java_lang_Long *) value)->value;
+                       LLNI_field_get_val((java_lang_Long *) value, value, val);
                        break;
                case PRIMITIVETYPE_FLOAT:
-                       val = ((java_lang_Float *) value)->value;
+                       LLNI_field_get_val((java_lang_Float *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
@@ -861,25 +823,25 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
 
                switch (sf->parseddesc->decltype) {
                case PRIMITIVETYPE_BYTE:
-                       val = ((java_lang_Byte *) value)->value;
+                       LLNI_field_get_val((java_lang_Byte *) value, value, val);
                        break;
                case PRIMITIVETYPE_CHAR:
-                       val = ((java_lang_Character *) value)->value;
+                       LLNI_field_get_val((java_lang_Character *) value, value, val);
                        break;
                case PRIMITIVETYPE_SHORT:
-                       val = ((java_lang_Short *) value)->value;
+                       LLNI_field_get_val((java_lang_Short *) value, value, val);
                        break;
                case PRIMITIVETYPE_INT:
-                       val = ((java_lang_Integer *) value)->value;
+                       LLNI_field_get_val((java_lang_Integer *) value, value, val);
                        break;
                case PRIMITIVETYPE_LONG:
-                       val = ((java_lang_Long *) value)->value;
+                       LLNI_field_get_val((java_lang_Long *) value, value, val);
                        break;
                case PRIMITIVETYPE_FLOAT:
-                       val = ((java_lang_Float *) value)->value;
+                       LLNI_field_get_val((java_lang_Float *) value, value, val);
                        break;
                case PRIMITIVETYPE_DOUBLE:
-                       val = ((java_lang_Double *) value)->value;
+                       LLNI_field_get_val((java_lang_Double *) value, value, val);
                        break;
                default:
                        exceptions_throw_illegalargumentexception();
@@ -894,7 +856,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
                /* check if value is an instance of the destination class */
 
                /* XXX TODO */
-               /*                      if (!builtin_instanceof((java_objectheader *) value, df->class)) */
+               /*                      if (!builtin_instanceof((java_handle_t *) value, df->class)) */
                /*                              break; */
 
                *((java_lang_Object **) faddr) = value;
@@ -912,16 +874,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r
  * Method:    setBoolean
  * Signature: (Ljava/lang/Object;Z)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -932,7 +896,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_BOOLEAN:
-               *((s4 *) addr) = value;
+               *((int32_t *) addr) = value;
                break;
        default:
                exceptions_throw_illegalargumentexception();
@@ -947,16 +911,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java
  * Method:    setByte
  * Signature: (Ljava/lang/Object;B)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -969,10 +935,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_la
        case PRIMITIVETYPE_BYTE:
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               *((s4 *) addr) = value;
+               *((int32_t *) addr) = value;
                break;
        case PRIMITIVETYPE_LONG:
-               *((s8 *) addr) = value;
+               *((int64_t *) addr) = value;
                break;
        case PRIMITIVETYPE_FLOAT:
                *((float *) addr) = value;
@@ -993,16 +959,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_la
  * Method:    setChar
  * Signature: (Ljava/lang/Object;C)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1014,10 +982,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_la
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_CHAR:
        case PRIMITIVETYPE_INT:
-               *((s4 *) addr) = value;
+               *((int32_t *) addr) = value;
                break;
        case PRIMITIVETYPE_LONG:
-               *((s8 *) addr) = value;
+               *((int64_t *) addr) = value;
                break;
        case PRIMITIVETYPE_FLOAT:
                *((float *) addr) = value;
@@ -1038,16 +1006,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_la
  * Method:    setShort
  * Signature: (Ljava/lang/Object;S)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1059,10 +1029,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_l
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_SHORT:
        case PRIMITIVETYPE_INT:
-               *((s4 *) addr) = value;
+               *((int32_t *) addr) = value;
                break;
        case PRIMITIVETYPE_LONG:
-               *((s8 *) addr) = value;
+               *((int64_t *) addr) = value;
                break;
        case PRIMITIVETYPE_FLOAT:
                *((float *) addr) = value;
@@ -1083,16 +1053,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_l
  * Method:    setInt
  * Signature: (Ljava/lang/Object;I)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1103,10 +1075,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lan
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_INT:
-               *((s4 *) addr) = value;
+               *((int32_t *) addr) = value;
                break;
        case PRIMITIVETYPE_LONG:
-               *((s8 *) addr) = value;
+               *((int64_t *) addr) = value;
                break;
        case PRIMITIVETYPE_FLOAT:
                *((float *) addr) = value;
@@ -1127,16 +1099,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lan
  * Method:    setLong
  * Signature: (Ljava/lang/Object;J)V
  */
-JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s8 value)
+JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int64_t value)
 {
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1147,7 +1121,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_la
 
        switch (f->parseddesc->decltype) {
        case PRIMITIVETYPE_LONG:
-               *((s8 *) addr) = value;
+               *((int64_t *) addr) = value;
                break;
        case PRIMITIVETYPE_FLOAT:
                *((float *) addr) = value;
@@ -1173,11 +1147,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setFloat(JNIEnv *env, java_l
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1211,11 +1187,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_
        classinfo *c;
        fieldinfo *f;
        void      *addr;
+       int32_t    slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        /* get the address of the field with an internal helper */
 
@@ -1243,14 +1221,16 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JNIEnv *env, java_lang_reflect_Field* this)
 {
-       classinfo         *c;
-       fieldinfo         *f;
-       java_objectheader *o;
+       classinfo     *c;
+       fieldinfo     *f;
+       java_handle_t *o;
+       int32_t        slot;
 
        /* get the class and the field */
 
-       c = (classinfo *) this->declaringClass;
-       f = &c->fields[this->slot];
+       LLNI_field_get_cls(this, clazz, c);
+       LLNI_field_get_val(this, slot , slot);
+       f = &c->fields[slot];
 
        if (f->signature == NULL)
                return NULL;
@@ -1263,6 +1243,37 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JN
 }
 
 
+#if defined(ENABLE_ANNOTATIONS)
+/*
+ * Class:     java/lang/reflect/Field
+ * Method:    declaredAnnotations
+ * Signature: ()Ljava/util/Map;
+ */
+JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Field_declaredAnnotations(JNIEnv *env, java_lang_reflect_Field *this)
+{
+       java_handle_t           *o                   = (java_handle_t*)this;
+       struct java_util_Map    *declaredAnnotations = NULL;
+       java_handle_bytearray_t *annotations         = NULL;
+       java_lang_Class         *declaringClass      = NULL;
+       classinfo               *referer             = NULL;
+
+       LLNI_field_get_ref(this, declaredAnnotations, declaredAnnotations);
+
+       if (declaredAnnotations == NULL) {
+               LLNI_field_get_val(this, annotations, annotations);
+               LLNI_field_get_ref(this, clazz, declaringClass);
+               LLNI_class_get(this, referer);
+
+               declaredAnnotations = reflect_get_declaredannotatios(annotations, declaringClass, referer);
+
+               LLNI_field_set_ref(this, declaredAnnotations, declaredAnnotations);
+       }
+
+       return declaredAnnotations;
+}
+#endif
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where