1 // natField.cc - Implementation of java.lang.reflect.Field native methods.
3 /* Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2006 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
16 #include <java-stack.h>
17 #include <java/lang/reflect/Field.h>
18 #include <java/lang/reflect/Modifier.h>
19 #include <java/lang/ArrayIndexOutOfBoundsException.h>
20 #include <java/lang/IllegalArgumentException.h>
21 #include <java/lang/IllegalAccessException.h>
22 #include <java/lang/NullPointerException.h>
23 #include <java/lang/Byte.h>
24 #include <java/lang/Short.h>
25 #include <java/lang/Integer.h>
26 #include <java/lang/Long.h>
27 #include <java/lang/Float.h>
28 #include <java/lang/Double.h>
29 #include <java/lang/Boolean.h>
30 #include <java/lang/Character.h>
32 typedef JArray
< ::java::lang::annotation::Annotation
* > * anno_a_t
;
35 java::lang::reflect::Field::getModifiersInternal ()
37 return _Jv_FromReflectedField (this)->flags
;
41 java::lang::reflect::Field::getSignature()
43 return declaringClass
->getReflectionSignature (this);
47 java::lang::reflect::Field::getDeclaredAnnotationsInternal()
49 return (anno_a_t
) declaringClass
->getDeclaredAnnotations(this);
53 java::lang::reflect::Field::getName ()
56 name
= _Jv_NewStringUtf8Const (_Jv_FromReflectedField (this)->name
);
61 java::lang::reflect::Field::getType ()
65 jfieldID fld
= _Jv_FromReflectedField (this);
66 JvSynchronize
sync (declaringClass
);
67 _Jv_Linker::resolve_field (fld
, declaringClass
->getClassLoaderInternal ());
74 getAddr (java::lang::reflect::Field
* field
, jclass caller
, jobject obj
,
77 using namespace java::lang::reflect
;
79 jfieldID fld
= _Jv_FromReflectedField (field
);
80 _Jv_ushort flags
= fld
->getModifiers();
82 // Setting a final field is usually not allowed.
84 // As of 1.5, you can set a non-static final field if it is
86 && (! field
->isAccessible()
87 || (field
->getModifiers() & java::lang::reflect::Modifier::STATIC
))
88 && (field
->getModifiers() & java::lang::reflect::Modifier::FINAL
))
89 throw new java::lang::IllegalAccessException(JvNewStringUTF
92 // Check accessibility, if required.
93 if (! (Modifier::isPublic (flags
) || field
->isAccessible()))
96 caller
= _Jv_StackTrace::GetCallingClass (&Field::class$
);
97 if (! _Jv_CheckAccess (caller
, field
->getDeclaringClass(), flags
))
98 throw new java::lang::IllegalAccessException
;
101 if (flags
& Modifier::STATIC
)
103 jclass fldClass
= field
->getDeclaringClass ();
104 JvInitClass(fldClass
);
110 throw new java::lang::NullPointerException
;
111 if (! _Jv_IsInstanceOf (obj
, field
->getDeclaringClass()))
112 throw new java::lang::IllegalArgumentException
;
113 return (void*) ((char*) obj
+ fld
->getOffset ());
118 getBoolean (jclass cls
, void* addr
)
120 if (cls
== JvPrimClass (boolean
))
121 return * (jboolean
*) addr
;
122 throw new java::lang::IllegalArgumentException
;
126 getChar (jclass cls
, void* addr
)
128 if (cls
== JvPrimClass (char))
129 return * (jchar
*) addr
;
130 throw new java::lang::IllegalArgumentException
;
134 getByte (jclass cls
, void* addr
)
136 if (cls
== JvPrimClass (byte
))
137 return * (jbyte
*) addr
;
138 throw new java::lang::IllegalArgumentException
;
142 getShort (jclass cls
, void* addr
)
144 if (cls
== JvPrimClass (short))
145 return * (jshort
*) addr
;
146 if (cls
== JvPrimClass (byte
))
147 return * (jbyte
*) addr
;
148 throw new java::lang::IllegalArgumentException
;
152 getInt (jclass cls
, void* addr
)
154 if (cls
== JvPrimClass (int))
155 return * (jint
*) addr
;
156 if (cls
== JvPrimClass (short))
157 return * (jshort
*) addr
;
158 if (cls
== JvPrimClass (char))
159 return * (jchar
*) addr
;
160 if (cls
== JvPrimClass (byte
))
161 return * (jbyte
*) addr
;
162 throw new java::lang::IllegalArgumentException
;
166 getLong (jclass cls
, void* addr
)
168 if (cls
== JvPrimClass (long))
169 return * (jlong
*) addr
;
170 return ::getInt(cls
, addr
);
174 getFloat (jclass cls
, void* addr
)
176 if (cls
== JvPrimClass (float))
177 return * (jfloat
*) addr
;
178 if (cls
== JvPrimClass (long))
179 return * (jlong
*) addr
;
180 return ::getInt(cls
, addr
);
184 getDouble (jclass cls
, void* addr
)
186 if (cls
== JvPrimClass (double))
187 return * (jdouble
*) addr
;
188 if (cls
== JvPrimClass (float))
189 return * (jfloat
*) addr
;
190 if (cls
== JvPrimClass (long))
191 return * (jlong
*) addr
;
192 return ::getInt(cls
, addr
);
196 java::lang::reflect::Field::getBoolean (jclass caller
, jobject obj
)
198 return ::getBoolean (this->getType(), getAddr (this, caller
, obj
, false));
202 java::lang::reflect::Field::getChar (jclass caller
, jobject obj
)
204 return ::getChar (this->getType(), getAddr (this, caller
, obj
, false));
208 java::lang::reflect::Field::getByte (jclass caller
, jobject obj
)
210 return ::getByte (this->getType(), getAddr (this, caller
, obj
, false));
214 java::lang::reflect::Field::getShort (jclass caller
, jobject obj
)
216 return ::getShort (this->getType(), getAddr (this, caller
, obj
, false));
220 java::lang::reflect::Field::getInt (jclass caller
, jobject obj
)
222 return ::getInt (this->getType(), getAddr (this, caller
, obj
, false));
226 java::lang::reflect::Field::getLong (jclass caller
, jobject obj
)
228 return ::getLong (this->getType(), getAddr (this, caller
, obj
, false));
232 java::lang::reflect::Field::getFloat (jclass caller
, jobject obj
)
234 return ::getFloat (this->getType(), getAddr (this, caller
, obj
, false));
238 java::lang::reflect::Field::getDouble (jclass caller
, jobject obj
)
240 return ::getDouble (this->getType(), getAddr (this, caller
, obj
, false));
244 java::lang::reflect::Field::get (jclass caller
, jobject obj
)
246 jclass type
= this->getType();
247 void* addr
= getAddr (this, caller
, obj
, false);
248 if (! type
->isPrimitive ())
249 return * (jobject
*) addr
;
250 if (type
== JvPrimClass (double))
251 return new java::lang::Double (* (jdouble
*) addr
);
252 if (type
== JvPrimClass (float))
253 return new java::lang::Float (* (jfloat
*) addr
);
254 if (type
== JvPrimClass (long))
255 return new java::lang::Long (* (jlong
*) addr
);
256 if (type
== JvPrimClass (int))
257 return new java::lang::Integer (* (jint
*) addr
);
258 if (type
== JvPrimClass (short))
259 return new java::lang::Short (* (jshort
*) addr
);
260 if (type
== JvPrimClass (byte
))
261 return new java::lang::Byte (* (jbyte
*) addr
);
262 if (type
== JvPrimClass (char))
263 return new java::lang::Character (* (jchar
*) addr
);
264 if (type
== JvPrimClass (boolean
))
266 _Jv_InitClass (&java::lang::Boolean::class$
);
267 if (* (jboolean
*) addr
)
268 return java::lang::Boolean::TRUE
;
270 return java::lang::Boolean::FALSE
;
272 throw new java::lang::IllegalArgumentException
;
276 setBoolean (jclass type
, void *addr
, jboolean value
)
278 if (type
== JvPrimClass (boolean
))
279 * (jboolean
*) addr
= value
;
281 throw new java::lang::IllegalArgumentException
;
285 setChar (jclass type
, void *addr
, jchar value
)
287 if (type
== JvPrimClass (char))
288 * (jchar
*) addr
= value
;
289 else if (type
== JvPrimClass (int))
290 * (jint
*) addr
= value
;
291 else if (type
== JvPrimClass (long))
292 * (jlong
*) addr
= value
;
293 else if (type
== JvPrimClass (float))
294 * (jfloat
*) addr
= value
;
295 else if (type
== JvPrimClass (double))
296 * (jdouble
*) addr
= value
;
298 throw new java::lang::IllegalArgumentException
;
302 setByte (jclass type
, void *addr
, jbyte value
)
304 if (type
== JvPrimClass (byte
))
305 * (jbyte
*) addr
= value
;
306 else if (type
== JvPrimClass (short))
307 * (jshort
*) addr
= value
;
308 else if (type
== JvPrimClass (int))
309 * (jint
*) addr
= value
;
310 else if (type
== JvPrimClass (long))
311 * (jlong
*) addr
= value
;
312 else if (type
== JvPrimClass (float))
313 * (jfloat
*) addr
= value
;
314 else if (type
== JvPrimClass (double))
315 * (jdouble
*) addr
= value
;
317 throw new java::lang::IllegalArgumentException
;
321 setShort (jclass type
, void *addr
, jshort value
)
323 if (type
== JvPrimClass (short))
324 * (jshort
*) addr
= value
;
325 else if (type
== JvPrimClass (int))
326 * (jint
*) addr
= value
;
327 else if (type
== JvPrimClass (long))
328 * (jlong
*) addr
= value
;
329 else if (type
== JvPrimClass (float))
330 * (jfloat
*) addr
= value
;
331 else if (type
== JvPrimClass (double))
332 * (jdouble
*) addr
= value
;
334 throw new java::lang::IllegalArgumentException
;
338 setInt (jclass type
, void *addr
, jint value
)
340 if (type
== JvPrimClass (int))
341 * (jint
*) addr
= value
;
342 else if (type
== JvPrimClass (long))
343 * (jlong
*) addr
= value
;
344 else if (type
== JvPrimClass (float))
345 * (jfloat
*) addr
= value
;
346 else if (type
== JvPrimClass (double))
347 * (jdouble
*) addr
= value
;
349 throw new java::lang::IllegalArgumentException
;
353 setLong (jclass type
, void *addr
, jlong value
)
355 if (type
== JvPrimClass (long))
356 * (jlong
*) addr
= value
;
357 else if (type
== JvPrimClass (float))
358 * (jfloat
*) addr
= value
;
359 else if (type
== JvPrimClass (double))
360 * (jdouble
*) addr
= value
;
362 throw new java::lang::IllegalArgumentException
;
366 setFloat (jclass type
, void *addr
, jfloat value
)
368 if (type
== JvPrimClass (float))
369 * (jfloat
*) addr
= value
;
370 else if (type
== JvPrimClass (double))
371 * (jdouble
*) addr
= value
;
373 throw new java::lang::IllegalArgumentException
;
377 setDouble (jclass type
, void *addr
, jdouble value
)
379 if (type
== JvPrimClass (double))
380 * (jdouble
*) addr
= value
;
382 throw new java::lang::IllegalArgumentException
;
386 java::lang::reflect::Field::setBoolean (jclass caller
, jobject obj
, jboolean b
,
389 ::setBoolean (this->getType(), getAddr (this, caller
, obj
, checkFinal
), b
);
393 java::lang::reflect::Field::setChar (jclass caller
, jobject obj
, jchar c
,
396 ::setChar (this->getType(), getAddr (this, caller
, obj
, checkFinal
), c
);
400 java::lang::reflect::Field::setByte (jclass caller
, jobject obj
, jbyte b
,
403 ::setByte (this->getType(), getAddr (this, caller
, obj
, checkFinal
), b
);
407 java::lang::reflect::Field::setShort (jclass caller
, jobject obj
, jshort s
,
410 ::setShort (this->getType(), getAddr (this, caller
, obj
, checkFinal
), s
);
414 java::lang::reflect::Field::setInt (jclass caller
, jobject obj
, jint i
,
417 ::setInt (this->getType(), getAddr (this, caller
, obj
, checkFinal
), i
);
421 java::lang::reflect::Field::setLong (jclass caller
, jobject obj
, jlong l
,
424 ::setLong (this->getType(), getAddr (this, caller
, obj
, checkFinal
), l
);
428 java::lang::reflect::Field::setFloat (jclass caller
, jobject obj
, jfloat f
,
431 ::setFloat (this->getType(), getAddr (this, caller
, obj
, checkFinal
), f
);
435 java::lang::reflect::Field::setDouble (jclass caller
, jobject obj
, jdouble d
,
438 ::setDouble (this->getType(), getAddr (this, caller
, obj
, checkFinal
), d
);
442 java::lang::reflect::Field::set (jclass caller
, jobject object
, jobject value
,
443 jclass type
, jboolean checkFinal
)
445 void* addr
= getAddr (this, caller
, object
, checkFinal
);
446 if (value
!= NULL
&& ! _Jv_IsInstanceOf (value
, type
))
447 throw new java::lang::IllegalArgumentException
;
448 * (jobject
*) addr
= value
;