1 /*
2 * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang.reflect;
27
28 import jdk.internal.misc.SharedSecrets;
29 import jdk.internal.reflect.CallerSensitive;
30 import jdk.internal.reflect.FieldAccessor;
31 import jdk.internal.reflect.Reflection;
32 import jdk.internal.vm.annotation.ForceInline;
33 import sun.reflect.generics.repository.FieldRepository;
34 import sun.reflect.generics.factory.CoreReflectionFactory;
35 import sun.reflect.generics.factory.GenericsFactory;
36 import sun.reflect.generics.scope.ClassScope;
37 import java.lang.annotation.Annotation;
38 import java.util.Map;
39 import java.util.Objects;
40 import sun.reflect.annotation.AnnotationParser;
41 import sun.reflect.annotation.AnnotationSupport;
42 import sun.reflect.annotation.TypeAnnotation;
43 import sun.reflect.annotation.TypeAnnotationParser;
44
45 /**
46 * A {@code Field} provides information about, and dynamic access to, a
47 * single field of a class or an interface. The reflected field may
48 * be a class (static) field or an instance field.
49 *
50 * <p>A {@code Field} permits widening conversions to occur during a get or
51 * set access operation, but throws an {@code IllegalArgumentException} if a
52 * narrowing conversion would occur.
53 *
54 * @see Member
55 * @see java.lang.Class
56 * @see java.lang.Class#getFields()
57 * @see java.lang.Class#getField(String)
58 * @see java.lang.Class#getDeclaredFields()
59 * @see java.lang.Class#getDeclaredField(String)
60 *
61 * @author Kenneth Russell
62 * @author Nakul Saraiya
63 * @since 1.1
64 */
65 public final
66 class Field extends AccessibleObject implements Member {
67
68 private Class<?> clazz;
69 private int slot;
70 // This is guaranteed to be interned by the VM in the 1.4
71 // reflection implementation
72 private String name;
73 private Class<?> type;
74 private int modifiers;
75 // Generics and annotations support
76 private transient String signature;
77 // generic info repository; lazily initialized
78 private transient FieldRepository genericInfo;
79 private byte[] annotations;
80 // Cached field accessor created without override
81 private FieldAccessor fieldAccessor;
82 // Cached field accessor created with override
83 private FieldAccessor overrideFieldAccessor;
84 // For sharing of FieldAccessors. This branching structure is
85 // currently only two levels deep (i.e., one root Field and
86 // potentially many Field objects pointing to it.)
87 //
88 // If this branching structure would ever contain cycles, deadlocks can
89 // occur in annotation code.
90 private Field root;
91
92 // Generics infrastructure
93
94 private String getGenericSignature() {return signature;}
95
96 // Accessor for factory
97 private GenericsFactory getFactory() {
98 Class<?> c = getDeclaringClass();
99 // create scope and factory
100 return CoreReflectionFactory.make(c, ClassScope.make(c));
101 }
102
103 // Accessor for generic info repository
104 private FieldRepository getGenericInfo() {
105 // lazily initialize repository if necessary
106 if (genericInfo == null) {
107 // create and cache generic info repository
108 genericInfo = FieldRepository.make(getGenericSignature(),
109 getFactory());
110 }
111 return genericInfo; //return cached repository
112 }
113
114
115 /**
116 * Package-private constructor used by ReflectAccess to enable
117 * instantiation of these objects in Java code from the java.lang
118 * package via sun.reflect.LangReflectAccess.
119 */
120 Field(Class<?> declaringClass,
121 String name,
122 Class<?> type,
123 int modifiers,
124 int slot,
125 String signature,
126 byte[] annotations)
127 {
128 this.clazz = declaringClass;
129 this.name = name;
130 this.type = type;
131 this.modifiers = modifiers;
132 this.slot = slot;
133 this.signature = signature;
134 this.annotations = annotations;
135 }
136
137 /**
138 * Package-private routine (exposed to java.lang.Class via
139 * ReflectAccess) which returns a copy of this Field. The copy's
140 * "root" field points to this Field.
141 */
142 Field copy() {
143 // This routine enables sharing of FieldAccessor objects
144 // among Field objects which refer to the same underlying
145 // method in the VM. (All of this contortion is only necessary
146 // because of the "accessibility" bit in AccessibleObject,
147 // which implicitly requires that new java.lang.reflect
148 // objects be fabricated for each reflective call on Class
149 // objects.)
150 if (this.root != null)
151 throw new IllegalArgumentException("Can not copy a non-root Field");
152
153 Field res = new Field(clazz, name, type, modifiers, slot, signature, annotations);
154 res.root = this;
155 // Might as well eagerly propagate this if already present
156 res.fieldAccessor = fieldAccessor;
157 res.overrideFieldAccessor = overrideFieldAccessor;
158
159 return res;
160 }
161
162 /**
163 * @throws InaccessibleObjectException {@inheritDoc}
164 * @throws SecurityException {@inheritDoc}
165 */
166 @Override
167 @CallerSensitive
168 public void setAccessible(boolean flag) {
169 AccessibleObject.checkPermission();
170 if (flag) checkCanSetAccessible(Reflection.getCallerClass());
171 setAccessible0(flag);
172 }
173
174 @Override
175 void checkCanSetAccessible(Class<?> caller) {
176 checkCanSetAccessible(caller, clazz);
177 }
178
179 /**
180 * Returns the {@code Class} object representing the class or interface
181 * that declares the field represented by this {@code Field} object.
182 */
183 @Override
184 public Class<?> getDeclaringClass() {
185 return clazz;
186 }
187
188 /**
189 * Returns the name of the field represented by this {@code Field} object.
190 */
191 public String getName() {
192 return name;
193 }
194
195 /**
196 * Returns the Java language modifiers for the field represented
197 * by this {@code Field} object, as an integer. The {@code Modifier} class should
198 * be used to decode the modifiers.
199 *
200 * @see Modifier
201 */
202 public int getModifiers() {
203 return modifiers;
204 }
205
206 /**
207 * Returns {@code true} if this field represents an element of
208 * an enumerated type; returns {@code false} otherwise.
209 *
210 * @return {@code true} if and only if this field represents an element of
211 * an enumerated type.
212 * @since 1.5
213 */
214 public boolean isEnumConstant() {
215 return (getModifiers() & Modifier.ENUM) != 0;
216 }
217
218 /**
219 * Returns {@code true} if this field is a synthetic
220 * field; returns {@code false} otherwise.
221 *
222 * @return true if and only if this field is a synthetic
223 * field as defined by the Java Language Specification.
224 * @since 1.5
225 */
226 public boolean isSynthetic() {
227 return Modifier.isSynthetic(getModifiers());
228 }
229
230 /**
231 * Returns a {@code Class} object that identifies the
232 * declared type for the field represented by this
233 * {@code Field} object.
234 *
235 * @return a {@code Class} object identifying the declared
236 * type of the field represented by this object
237 */
238 public Class<?> getType() {
239 return type;
240 }
241
242 /**
243 * Returns a {@code Type} object that represents the declared type for
244 * the field represented by this {@code Field} object.
245 *
246 * <p>If the {@code Type} is a parameterized type, the
247 * {@code Type} object returned must accurately reflect the
248 * actual type parameters used in the source code.
249 *
250 * <p>If the type of the underlying field is a type variable or a
251 * parameterized type, it is created. Otherwise, it is resolved.
252 *
253 * @return a {@code Type} object that represents the declared type for
254 * the field represented by this {@code Field} object
255 * @throws GenericSignatureFormatError if the generic field
256 * signature does not conform to the format specified in
257 * <cite>The Java™ Virtual Machine Specification</cite>
258 * @throws TypeNotPresentException if the generic type
259 * signature of the underlying field refers to a non-existent
260 * type declaration
261 * @throws MalformedParameterizedTypeException if the generic
262 * signature of the underlying field refers to a parameterized type
263 * that cannot be instantiated for any reason
264 * @since 1.5
265 */
266 public Type getGenericType() {
267 if (getGenericSignature() != null)
268 return getGenericInfo().getGenericType();
269 else
270 return getType();
271 }
272
273
274 /**
275 * Compares this {@code Field} against the specified object. Returns
276 * true if the objects are the same. Two {@code Field} objects are the same if
277 * they were declared by the same class and have the same name
278 * and type.
279 */
280 public boolean equals(Object obj) {
281 if (obj != null && obj instanceof Field) {
282 Field other = (Field)obj;
283 return (getDeclaringClass() == other.getDeclaringClass())
284 && (getName() == other.getName())
285 && (getType() == other.getType());
286 }
287 return false;
288 }
289
290 /**
291 * Returns a hashcode for this {@code Field}. This is computed as the
292 * exclusive-or of the hashcodes for the underlying field's
293 * declaring class name and its name.
294 */
295 public int hashCode() {
296 return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
297 }
298
299 /**
300 * Returns a string describing this {@code Field}. The format is
301 * the access modifiers for the field, if any, followed
302 * by the field type, followed by a space, followed by
303 * the fully-qualified name of the class declaring the field,
304 * followed by a period, followed by the name of the field.
305 * For example:
306 * <pre>
307 * public static final int java.lang.Thread.MIN_PRIORITY
308 * private int java.io.FileDescriptor.fd
309 * </pre>
310 *
311 * <p>The modifiers are placed in canonical order as specified by
312 * "The Java Language Specification". This is {@code public},
313 * {@code protected} or {@code private} first, and then other
314 * modifiers in the following order: {@code static}, {@code final},
315 * {@code transient}, {@code volatile}.
316 *
317 * @return a string describing this {@code Field}
318 * @jls 8.3.1 Field Modifiers
319 */
320 public String toString() {
321 int mod = getModifiers();
322 return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
323 + getType().getTypeName() + " "
324 + getDeclaringClass().getTypeName() + "."
325 + getName());
326 }
327
328 @Override
329 String toShortString() {
330 return "field " + getDeclaringClass().getTypeName() + "." + getName();
331 }
332
333 /**
334 * Returns a string describing this {@code Field}, including
335 * its generic type. The format is the access modifiers for the
336 * field, if any, followed by the generic field type, followed by
337 * a space, followed by the fully-qualified name of the class
338 * declaring the field, followed by a period, followed by the name
339 * of the field.
340 *
341 * <p>The modifiers are placed in canonical order as specified by
342 * "The Java Language Specification". This is {@code public},
343 * {@code protected} or {@code private} first, and then other
344 * modifiers in the following order: {@code static}, {@code final},
345 * {@code transient}, {@code volatile}.
346 *
347 * @return a string describing this {@code Field}, including
348 * its generic type
349 *
350 * @since 1.5
351 * @jls 8.3.1 Field Modifiers
352 */
353 public String toGenericString() {
354 int mod = getModifiers();
355 Type fieldType = getGenericType();
356 return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
357 + fieldType.getTypeName() + " "
358 + getDeclaringClass().getTypeName() + "."
359 + getName());
360 }
361
362 /**
363 * Returns the value of the field represented by this {@code Field}, on
364 * the specified object. The value is automatically wrapped in an
365 * object if it has a primitive type.
366 *
367 * <p>The underlying field's value is obtained as follows:
368 *
369 * <p>If the underlying field is a static field, the {@code obj} argument
370 * is ignored; it may be null.
371 *
372 * <p>Otherwise, the underlying field is an instance field. If the
373 * specified {@code obj} argument is null, the method throws a
374 * {@code NullPointerException}. If the specified object is not an
375 * instance of the class or interface declaring the underlying
376 * field, the method throws an {@code IllegalArgumentException}.
377 *
378 * <p>If this {@code Field} object is enforcing Java language access control, and
379 * the underlying field is inaccessible, the method throws an
380 * {@code IllegalAccessException}.
381 * If the underlying field is static, the class that declared the
382 * field is initialized if it has not already been initialized.
383 *
384 * <p>Otherwise, the value is retrieved from the underlying instance
385 * or static field. If the field has a primitive type, the value
386 * is wrapped in an object before being returned, otherwise it is
387 * returned as is.
388 *
389 * <p>If the field is hidden in the type of {@code obj},
390 * the field's value is obtained according to the preceding rules.
391 *
392 * @param obj object from which the represented field's value is
393 * to be extracted
394 * @return the value of the represented field in object
395 * {@code obj}; primitive values are wrapped in an appropriate
396 * object before being returned
397 *
398 * @exception IllegalAccessException if this {@code Field} object
399 * is enforcing Java language access control and the underlying
400 * field is inaccessible.
401 * @exception IllegalArgumentException if the specified object is not an
402 * instance of the class or interface declaring the underlying
403 * field (or a subclass or implementor thereof).
404 * @exception NullPointerException if the specified object is null
405 * and the field is an instance field.
406 * @exception ExceptionInInitializerError if the initialization provoked
407 * by this method fails.
408 */
409 @CallerSensitive
410 @ForceInline // to ensure Reflection.getCallerClass optimization
411 public Object get(Object obj)
412 throws IllegalArgumentException, IllegalAccessException
413 {
414 if (!override) {
415 Class<?> caller = Reflection.getCallerClass();
416 checkAccess(caller, obj);
417 }
418 return getFieldAccessor(obj).get(obj);
419 }
420
421 /**
422 * Gets the value of a static or instance {@code boolean} field.
423 *
424 * @param obj the object to extract the {@code boolean} value
425 * from
426 * @return the value of the {@code boolean} field
427 *
428 * @exception IllegalAccessException if this {@code Field} object
429 * is enforcing Java language access control and the underlying
430 * field is inaccessible.
431 * @exception IllegalArgumentException if the specified object is not
432 * an instance of the class or interface declaring the
433 * underlying field (or a subclass or implementor
434 * thereof), or if the field value cannot be
435 * converted to the type {@code boolean} by a
436 * widening conversion.
437 * @exception NullPointerException if the specified object is null
438 * and the field is an instance field.
439 * @exception ExceptionInInitializerError if the initialization provoked
440 * by this method fails.
441 * @see Field#get
442 */
443 @CallerSensitive
444 @ForceInline // to ensure Reflection.getCallerClass optimization
445 public boolean getBoolean(Object obj)
446 throws IllegalArgumentException, IllegalAccessException
447 {
448 if (!override) {
449 Class<?> caller = Reflection.getCallerClass();
450 checkAccess(caller, obj);
451 }
452 return getFieldAccessor(obj).getBoolean(obj);
453 }
454
455 /**
456 * Gets the value of a static or instance {@code byte} field.
457 *
458 * @param obj the object to extract the {@code byte} value
459 * from
460 * @return the value of the {@code byte} field
461 *
462 * @exception IllegalAccessException if this {@code Field} object
463 * is enforcing Java language access control and the underlying
464 * field is inaccessible.
465 * @exception IllegalArgumentException if the specified object is not
466 * an instance of the class or interface declaring the
467 * underlying field (or a subclass or implementor
468 * thereof), or if the field value cannot be
469 * converted to the type {@code byte} by a
470 * widening conversion.
471 * @exception NullPointerException if the specified object is null
472 * and the field is an instance field.
473 * @exception ExceptionInInitializerError if the initialization provoked
474 * by this method fails.
475 * @see Field#get
476 */
477 @CallerSensitive
478 @ForceInline // to ensure Reflection.getCallerClass optimization
479 public byte getByte(Object obj)
480 throws IllegalArgumentException, IllegalAccessException
481 {
482 if (!override) {
483 Class<?> caller = Reflection.getCallerClass();
484 checkAccess(caller, obj);
485 }
486 return getFieldAccessor(obj).getByte(obj);
487 }
488
489 /**
490 * Gets the value of a static or instance field of type
491 * {@code char} or of another primitive type convertible to
492 * type {@code char} via a widening conversion.
493 *
494 * @param obj the object to extract the {@code char} value
495 * from
496 * @return the value of the field converted to type {@code char}
497 *
498 * @exception IllegalAccessException if this {@code Field} object
499 * is enforcing Java language access control and the underlying
500 * field is inaccessible.
501 * @exception IllegalArgumentException if the specified object is not
502 * an instance of the class or interface declaring the
503 * underlying field (or a subclass or implementor
504 * thereof), or if the field value cannot be
505 * converted to the type {@code char} by a
506 * widening conversion.
507 * @exception NullPointerException if the specified object is null
508 * and the field is an instance field.
509 * @exception ExceptionInInitializerError if the initialization provoked
510 * by this method fails.
511 * @see Field#get
512 */
513 @CallerSensitive
514 @ForceInline // to ensure Reflection.getCallerClass optimization
515 public char getChar(Object obj)
516 throws IllegalArgumentException, IllegalAccessException
517 {
518 if (!override) {
519 Class<?> caller = Reflection.getCallerClass();
520 checkAccess(caller, obj);
521 }
522 return getFieldAccessor(obj).getChar(obj);
523 }
524
525 /**
526 * Gets the value of a static or instance field of type
527 * {@code short} or of another primitive type convertible to
528 * type {@code short} via a widening conversion.
529 *
530 * @param obj the object to extract the {@code short} value
531 * from
532 * @return the value of the field converted to type {@code short}
533 *
534 * @exception IllegalAccessException if this {@code Field} object
535 * is enforcing Java language access control and the underlying
536 * field is inaccessible.
537 * @exception IllegalArgumentException if the specified object is not
538 * an instance of the class or interface declaring the
539 * underlying field (or a subclass or implementor
540 * thereof), or if the field value cannot be
541 * converted to the type {@code short} by a
542 * widening conversion.
543 * @exception NullPointerException if the specified object is null
544 * and the field is an instance field.
545 * @exception ExceptionInInitializerError if the initialization provoked
546 * by this method fails.
547 * @see Field#get
548 */
549 @CallerSensitive
550 @ForceInline // to ensure Reflection.getCallerClass optimization
551 public short getShort(Object obj)
552 throws IllegalArgumentException, IllegalAccessException
553 {
554 if (!override) {
555 Class<?> caller = Reflection.getCallerClass();
556 checkAccess(caller, obj);
557 }
558 return getFieldAccessor(obj).getShort(obj);
559 }
560
561 /**
562 * Gets the value of a static or instance field of type
563 * {@code int} or of another primitive type convertible to
564 * type {@code int} via a widening conversion.
565 *
566 * @param obj the object to extract the {@code int} value
567 * from
568 * @return the value of the field converted to type {@code int}
569 *
570 * @exception IllegalAccessException if this {@code Field} object
571 * is enforcing Java language access control and the underlying
572 * field is inaccessible.
573 * @exception IllegalArgumentException if the specified object is not
574 * an instance of the class or interface declaring the
575 * underlying field (or a subclass or implementor
576 * thereof), or if the field value cannot be
577 * converted to the type {@code int} by a
578 * widening conversion.
579 * @exception NullPointerException if the specified object is null
580 * and the field is an instance field.
581 * @exception ExceptionInInitializerError if the initialization provoked
582 * by this method fails.
583 * @see Field#get
584 */
585 @CallerSensitive
586 @ForceInline // to ensure Reflection.getCallerClass optimization
587 public int getInt(Object obj)
588 throws IllegalArgumentException, IllegalAccessException
589 {
590 if (!override) {
591 Class<?> caller = Reflection.getCallerClass();
592 checkAccess(caller, obj);
593 }
594 return getFieldAccessor(obj).getInt(obj);
595 }
596
597 /**
598 * Gets the value of a static or instance field of type
599 * {@code long} or of another primitive type convertible to
600 * type {@code long} via a widening conversion.
601 *
602 * @param obj the object to extract the {@code long} value
603 * from
604 * @return the value of the field converted to type {@code long}
605 *
606 * @exception IllegalAccessException if this {@code Field} object
607 * is enforcing Java language access control and the underlying
608 * field is inaccessible.
609 * @exception IllegalArgumentException if the specified object is not
610 * an instance of the class or interface declaring the
611 * underlying field (or a subclass or implementor
612 * thereof), or if the field value cannot be
613 * converted to the type {@code long} by a
614 * widening conversion.
615 * @exception NullPointerException if the specified object is null
616 * and the field is an instance field.
617 * @exception ExceptionInInitializerError if the initialization provoked
618 * by this method fails.
619 * @see Field#get
620 */
621 @CallerSensitive
622 @ForceInline // to ensure Reflection.getCallerClass optimization
623 public long getLong(Object obj)
624 throws IllegalArgumentException, IllegalAccessException
625 {
626 if (!override) {
627 Class<?> caller = Reflection.getCallerClass();
628 checkAccess(caller, obj);
629 }
630 return getFieldAccessor(obj).getLong(obj);
631 }
632
633 /**
634 * Gets the value of a static or instance field of type
635 * {@code float} or of another primitive type convertible to
636 * type {@code float} via a widening conversion.
637 *
638 * @param obj the object to extract the {@code float} value
639 * from
640 * @return the value of the field converted to type {@code float}
641 *
642 * @exception IllegalAccessException if this {@code Field} object
643 * is enforcing Java language access control and the underlying
644 * field is inaccessible.
645 * @exception IllegalArgumentException if the specified object is not
646 * an instance of the class or interface declaring the
647 * underlying field (or a subclass or implementor
648 * thereof), or if the field value cannot be
649 * converted to the type {@code float} by a
650 * widening conversion.
651 * @exception NullPointerException if the specified object is null
652 * and the field is an instance field.
653 * @exception ExceptionInInitializerError if the initialization provoked
654 * by this method fails.
655 * @see Field#get
656 */
657 @CallerSensitive
658 @ForceInline // to ensure Reflection.getCallerClass optimization
659 public float getFloat(Object obj)
660 throws IllegalArgumentException, IllegalAccessException
661 {
662 if (!override) {
663 Class<?> caller = Reflection.getCallerClass();
664 checkAccess(caller, obj);
665 }
666 return getFieldAccessor(obj).getFloat(obj);
667 }
668
669 /**
670 * Gets the value of a static or instance field of type
671 * {@code double} or of another primitive type convertible to
672 * type {@code double} via a widening conversion.
673 *
674 * @param obj the object to extract the {@code double} value
675 * from
676 * @return the value of the field converted to type {@code double}
677 *
678 * @exception IllegalAccessException if this {@code Field} object
679 * is enforcing Java language access control and the underlying
680 * field is inaccessible.
681 * @exception IllegalArgumentException if the specified object is not
682 * an instance of the class or interface declaring the
683 * underlying field (or a subclass or implementor
684 * thereof), or if the field value cannot be
685 * converted to the type {@code double} by a
686 * widening conversion.
687 * @exception NullPointerException if the specified object is null
688 * and the field is an instance field.
689 * @exception ExceptionInInitializerError if the initialization provoked
690 * by this method fails.
691 * @see Field#get
692 */
693 @CallerSensitive
694 @ForceInline // to ensure Reflection.getCallerClass optimization
695 public double getDouble(Object obj)
696 throws IllegalArgumentException, IllegalAccessException
697 {
698 if (!override) {
699 Class<?> caller = Reflection.getCallerClass();
700 checkAccess(caller, obj);
701 }
702 return getFieldAccessor(obj).getDouble(obj);
703 }
704
705 /**
706 * Sets the field represented by this {@code Field} object on the
707 * specified object argument to the specified new value. The new
708 * value is automatically unwrapped if the underlying field has a
709 * primitive type.
710 *
711 * <p>The operation proceeds as follows:
712 *
713 * <p>If the underlying field is static, the {@code obj} argument is
714 * ignored; it may be null.
715 *
716 * <p>Otherwise the underlying field is an instance field. If the
717 * specified object argument is null, the method throws a
718 * {@code NullPointerException}. If the specified object argument is not
719 * an instance of the class or interface declaring the underlying
720 * field, the method throws an {@code IllegalArgumentException}.
721 *
722 * <p>If this {@code Field} object is enforcing Java language access control, and
723 * the underlying field is inaccessible, the method throws an
724 * {@code IllegalAccessException}.
725 *
726 * <p>If the underlying field is final, the method throws an
727 * {@code IllegalAccessException} unless {@code setAccessible(true)}
728 * has succeeded for this {@code Field} object
729 * and the field is non-static. Setting a final field in this way
730 * is meaningful only during deserialization or reconstruction of
731 * instances of classes with blank final fields, before they are
732 * made available for access by other parts of a program. Use in
733 * any other context may have unpredictable effects, including cases
734 * in which other parts of a program continue to use the original
735 * value of this field.
736 *
737 * <p>If the underlying field is of a primitive type, an unwrapping
738 * conversion is attempted to convert the new value to a value of
739 * a primitive type. If this attempt fails, the method throws an
740 * {@code IllegalArgumentException}.
741 *
742 * <p>If, after possible unwrapping, the new value cannot be
743 * converted to the type of the underlying field by an identity or
744 * widening conversion, the method throws an
745 * {@code IllegalArgumentException}.
746 *
747 * <p>If the underlying field is static, the class that declared the
748 * field is initialized if it has not already been initialized.
749 *
750 * <p>The field is set to the possibly unwrapped and widened new value.
751 *
752 * <p>If the field is hidden in the type of {@code obj},
753 * the field's value is set according to the preceding rules.
754 *
755 * @param obj the object whose field should be modified
756 * @param value the new value for the field of {@code obj}
757 * being modified
758 *
759 * @exception IllegalAccessException if this {@code Field} object
760 * is enforcing Java language access control and the underlying
761 * field is either inaccessible or final.
762 * @exception IllegalArgumentException if the specified object is not an
763 * instance of the class or interface declaring the underlying
764 * field (or a subclass or implementor thereof),
765 * or if an unwrapping conversion fails.
766 * @exception NullPointerException if the specified object is null
767 * and the field is an instance field.
768 * @exception ExceptionInInitializerError if the initialization provoked
769 * by this method fails.
770 */
771 @CallerSensitive
772 @ForceInline // to ensure Reflection.getCallerClass optimization
773 public void set(Object obj, Object value)
774 throws IllegalArgumentException, IllegalAccessException
775 {
776 if (!override) {
777 Class<?> caller = Reflection.getCallerClass();
778 checkAccess(caller, obj);
779 }
780 getFieldAccessor(obj).set(obj, value);
781 }
782
783 /**
784 * Sets the value of a field as a {@code boolean} on the specified object.
785 * This method is equivalent to
786 * {@code set(obj, zObj)},
787 * where {@code zObj} is a {@code Boolean} object and
788 * {@code zObj.booleanValue() == z}.
789 *
790 * @param obj the object whose field should be modified
791 * @param z the new value for the field of {@code obj}
792 * being modified
793 *
794 * @exception IllegalAccessException if this {@code Field} object
795 * is enforcing Java language access control and the underlying
796 * field is either inaccessible or final.
797 * @exception IllegalArgumentException if the specified object is not an
798 * instance of the class or interface declaring the underlying
799 * field (or a subclass or implementor thereof),
800 * or if an unwrapping conversion fails.
801 * @exception NullPointerException if the specified object is null
802 * and the field is an instance field.
803 * @exception ExceptionInInitializerError if the initialization provoked
804 * by this method fails.
805 * @see Field#set
806 */
807 @CallerSensitive
808 @ForceInline // to ensure Reflection.getCallerClass optimization
809 public void setBoolean(Object obj, boolean z)
810 throws IllegalArgumentException, IllegalAccessException
811 {
812 if (!override) {
813 Class<?> caller = Reflection.getCallerClass();
814 checkAccess(caller, obj);
815 }
816 getFieldAccessor(obj).setBoolean(obj, z);
817 }
818
819 /**
820 * Sets the value of a field as a {@code byte} on the specified object.
821 * This method is equivalent to
822 * {@code set(obj, bObj)},
823 * where {@code bObj} is a {@code Byte} object and
824 * {@code bObj.byteValue() == b}.
825 *
826 * @param obj the object whose field should be modified
827 * @param b the new value for the field of {@code obj}
828 * being modified
829 *
830 * @exception IllegalAccessException if this {@code Field} object
831 * is enforcing Java language access control and the underlying
832 * field is either inaccessible or final.
833 * @exception IllegalArgumentException if the specified object is not an
834 * instance of the class or interface declaring the underlying
835 * field (or a subclass or implementor thereof),
836 * or if an unwrapping conversion fails.
837 * @exception NullPointerException if the specified object is null
838 * and the field is an instance field.
839 * @exception ExceptionInInitializerError if the initialization provoked
840 * by this method fails.
841 * @see Field#set
842 */
843 @CallerSensitive
844 @ForceInline // to ensure Reflection.getCallerClass optimization
845 public void setByte(Object obj, byte b)
846 throws IllegalArgumentException, IllegalAccessException
847 {
848 if (!override) {
849 Class<?> caller = Reflection.getCallerClass();
850 checkAccess(caller, obj);
851 }
852 getFieldAccessor(obj).setByte(obj, b);
853 }
854
855 /**
856 * Sets the value of a field as a {@code char} on the specified object.
857 * This method is equivalent to
858 * {@code set(obj, cObj)},
859 * where {@code cObj} is a {@code Character} object and
860 * {@code cObj.charValue() == c}.
861 *
862 * @param obj the object whose field should be modified
863 * @param c the new value for the field of {@code obj}
864 * being modified
865 *
866 * @exception IllegalAccessException if this {@code Field} object
867 * is enforcing Java language access control and the underlying
868 * field is either inaccessible or final.
869 * @exception IllegalArgumentException if the specified object is not an
870 * instance of the class or interface declaring the underlying
871 * field (or a subclass or implementor thereof),
872 * or if an unwrapping conversion fails.
873 * @exception NullPointerException if the specified object is null
874 * and the field is an instance field.
875 * @exception ExceptionInInitializerError if the initialization provoked
876 * by this method fails.
877 * @see Field#set
878 */
879 @CallerSensitive
880 @ForceInline // to ensure Reflection.getCallerClass optimization
881 public void setChar(Object obj, char c)
882 throws IllegalArgumentException, IllegalAccessException
883 {
884 if (!override) {
885 Class<?> caller = Reflection.getCallerClass();
886 checkAccess(caller, obj);
887 }
888 getFieldAccessor(obj).setChar(obj, c);
889 }
890
891 /**
892 * Sets the value of a field as a {@code short} on the specified object.
893 * This method is equivalent to
894 * {@code set(obj, sObj)},
895 * where {@code sObj} is a {@code Short} object and
896 * {@code sObj.shortValue() == s}.
897 *
898 * @param obj the object whose field should be modified
899 * @param s the new value for the field of {@code obj}
900 * being modified
901 *
902 * @exception IllegalAccessException if this {@code Field} object
903 * is enforcing Java language access control and the underlying
904 * field is either inaccessible or final.
905 * @exception IllegalArgumentException if the specified object is not an
906 * instance of the class or interface declaring the underlying
907 * field (or a subclass or implementor thereof),
908 * or if an unwrapping conversion fails.
909 * @exception NullPointerException if the specified object is null
910 * and the field is an instance field.
911 * @exception ExceptionInInitializerError if the initialization provoked
912 * by this method fails.
913 * @see Field#set
914 */
915 @CallerSensitive
916 @ForceInline // to ensure Reflection.getCallerClass optimization
917 public void setShort(Object obj, short s)
918 throws IllegalArgumentException, IllegalAccessException
919 {
920 if (!override) {
921 Class<?> caller = Reflection.getCallerClass();
922 checkAccess(caller, obj);
923 }
924 getFieldAccessor(obj).setShort(obj, s);
925 }
926
927 /**
928 * Sets the value of a field as an {@code int} on the specified object.
929 * This method is equivalent to
930 * {@code set(obj, iObj)},
931 * where {@code iObj} is an {@code Integer} object and
932 * {@code iObj.intValue() == i}.
933 *
934 * @param obj the object whose field should be modified
935 * @param i the new value for the field of {@code obj}
936 * being modified
937 *
938 * @exception IllegalAccessException if this {@code Field} object
939 * is enforcing Java language access control and the underlying
940 * field is either inaccessible or final.
941 * @exception IllegalArgumentException if the specified object is not an
942 * instance of the class or interface declaring the underlying
943 * field (or a subclass or implementor thereof),
944 * or if an unwrapping conversion fails.
945 * @exception NullPointerException if the specified object is null
946 * and the field is an instance field.
947 * @exception ExceptionInInitializerError if the initialization provoked
948 * by this method fails.
949 * @see Field#set
950 */
951 @CallerSensitive
952 @ForceInline // to ensure Reflection.getCallerClass optimization
953 public void setInt(Object obj, int i)
954 throws IllegalArgumentException, IllegalAccessException
955 {
956 if (!override) {
957 Class<?> caller = Reflection.getCallerClass();
958 checkAccess(caller, obj);
959 }
960 getFieldAccessor(obj).setInt(obj, i);
961 }
962
963 /**
964 * Sets the value of a field as a {@code long} on the specified object.
965 * This method is equivalent to
966 * {@code set(obj, lObj)},
967 * where {@code lObj} is a {@code Long} object and
968 * {@code lObj.longValue() == l}.
969 *
970 * @param obj the object whose field should be modified
971 * @param l the new value for the field of {@code obj}
972 * being modified
973 *
974 * @exception IllegalAccessException if this {@code Field} object
975 * is enforcing Java language access control and the underlying
976 * field is either inaccessible or final.
977 * @exception IllegalArgumentException if the specified object is not an
978 * instance of the class or interface declaring the underlying
979 * field (or a subclass or implementor thereof),
980 * or if an unwrapping conversion fails.
981 * @exception NullPointerException if the specified object is null
982 * and the field is an instance field.
983 * @exception ExceptionInInitializerError if the initialization provoked
984 * by this method fails.
985 * @see Field#set
986 */
987 @CallerSensitive
988 @ForceInline // to ensure Reflection.getCallerClass optimization
989 public void setLong(Object obj, long l)
990 throws IllegalArgumentException, IllegalAccessException
991 {
992 if (!override) {
993 Class<?> caller = Reflection.getCallerClass();
994 checkAccess(caller, obj);
995 }
996 getFieldAccessor(obj).setLong(obj, l);
997 }
998
999 /**
1000 * Sets the value of a field as a {@code float} on the specified object.
1001 * This method is equivalent to
1002 * {@code set(obj, fObj)},
1003 * where {@code fObj} is a {@code Float} object and
1004 * {@code fObj.floatValue() == f}.
1005 *
1006 * @param obj the object whose field should be modified
1007 * @param f the new value for the field of {@code obj}
1008 * being modified
1009 *
1010 * @exception IllegalAccessException if this {@code Field} object
1011 * is enforcing Java language access control and the underlying
1012 * field is either inaccessible or final.
1013 * @exception IllegalArgumentException if the specified object is not an
1014 * instance of the class or interface declaring the underlying
1015 * field (or a subclass or implementor thereof),
1016 * or if an unwrapping conversion fails.
1017 * @exception NullPointerException if the specified object is null
1018 * and the field is an instance field.
1019 * @exception ExceptionInInitializerError if the initialization provoked
1020 * by this method fails.
1021 * @see Field#set
1022 */
1023 @CallerSensitive
1024 @ForceInline // to ensure Reflection.getCallerClass optimization
1025 public void setFloat(Object obj, float f)
1026 throws IllegalArgumentException, IllegalAccessException
1027 {
1028 if (!override) {
1029 Class<?> caller = Reflection.getCallerClass();
1030 checkAccess(caller, obj);
1031 }
1032 getFieldAccessor(obj).setFloat(obj, f);
1033 }
1034
1035 /**
1036 * Sets the value of a field as a {@code double} on the specified object.
1037 * This method is equivalent to
1038 * {@code set(obj, dObj)},
1039 * where {@code dObj} is a {@code Double} object and
1040 * {@code dObj.doubleValue() == d}.
1041 *
1042 * @param obj the object whose field should be modified
1043 * @param d the new value for the field of {@code obj}
1044 * being modified
1045 *
1046 * @exception IllegalAccessException if this {@code Field} object
1047 * is enforcing Java language access control and the underlying
1048 * field is either inaccessible or final.
1049 * @exception IllegalArgumentException if the specified object is not an
1050 * instance of the class or interface declaring the underlying
1051 * field (or a subclass or implementor thereof),
1052 * or if an unwrapping conversion fails.
1053 * @exception NullPointerException if the specified object is null
1054 * and the field is an instance field.
1055 * @exception ExceptionInInitializerError if the initialization provoked
1056 * by this method fails.
1057 * @see Field#set
1058 */
1059 @CallerSensitive
1060 @ForceInline // to ensure Reflection.getCallerClass optimization
1061 public void setDouble(Object obj, double d)
1062 throws IllegalArgumentException, IllegalAccessException
1063 {
1064 if (!override) {
1065 Class<?> caller = Reflection.getCallerClass();
1066 checkAccess(caller, obj);
1067 }
1068 getFieldAccessor(obj).setDouble(obj, d);
1069 }
1070
1071 // check access to field
1072 private void checkAccess(Class<?> caller, Object obj)
1073 throws IllegalAccessException
1074 {
1075 checkAccess(caller, clazz,
1076 Modifier.isStatic(modifiers) ? null : obj.getClass(),
1077 modifiers);
1078 }
1079
1080 // security check is done before calling this method
1081 private FieldAccessor getFieldAccessor(Object obj)
1082 throws IllegalAccessException
1083 {
1084 boolean ov = override;
1085 FieldAccessor a = (ov) ? overrideFieldAccessor : fieldAccessor;
1086 return (a != null) ? a : acquireFieldAccessor(ov);
1087 }
1088
1089 // NOTE that there is no synchronization used here. It is correct
1090 // (though not efficient) to generate more than one FieldAccessor
1091 // for a given Field. However, avoiding synchronization will
1092 // probably make the implementation more scalable.
1093 private FieldAccessor acquireFieldAccessor(boolean overrideFinalCheck) {
1094 // First check to see if one has been created yet, and take it
1095 // if so
1096 FieldAccessor tmp = null;
1097 if (root != null) tmp = root.getFieldAccessor(overrideFinalCheck);
1098 if (tmp != null) {
1099 if (overrideFinalCheck)
1100 overrideFieldAccessor = tmp;
1101 else
1102 fieldAccessor = tmp;
1103 } else {
1104 // Otherwise fabricate one and propagate it up to the root
1105 tmp = reflectionFactory.newFieldAccessor(this, overrideFinalCheck);
1106 setFieldAccessor(tmp, overrideFinalCheck);
1107 }
1108
1109 return tmp;
1110 }
1111
1112 // Returns FieldAccessor for this Field object, not looking up
1113 // the chain to the root
1114 private FieldAccessor getFieldAccessor(boolean overrideFinalCheck) {
1115 return (overrideFinalCheck)? overrideFieldAccessor : fieldAccessor;
1116 }
1117
1118 // Sets the FieldAccessor for this Field object and
1119 // (recursively) its root
1120 private void setFieldAccessor(FieldAccessor accessor, boolean overrideFinalCheck) {
1121 if (overrideFinalCheck)
1122 overrideFieldAccessor = accessor;
1123 else
1124 fieldAccessor = accessor;
1125 // Propagate up
1126 if (root != null) {
1127 root.setFieldAccessor(accessor, overrideFinalCheck);
1128 }
1129 }
1130
1131 @Override
1132 Field getRoot() {
1133 return root;
1134 }
1135
1136 /**
1137 * @throws NullPointerException {@inheritDoc}
1138 * @since 1.5
1139 */
1140 public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
1141 Objects.requireNonNull(annotationClass);
1142 return annotationClass.cast(declaredAnnotations().get(annotationClass));
1143 }
1144
1145 /**
1146 * {@inheritDoc}
1147 * @throws NullPointerException {@inheritDoc}
1148 * @since 1.8
1149 */
1150 @Override
1151 public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
1152 Objects.requireNonNull(annotationClass);
1153
1154 return AnnotationSupport.getDirectlyAndIndirectlyPresent(declaredAnnotations(), annotationClass);
1155 }
1156
1157 /**
1158 * {@inheritDoc}
1159 */
1160 public Annotation[] getDeclaredAnnotations() {
1161 return AnnotationParser.toArray(declaredAnnotations());
1162 }
1163
1164 private transient volatile Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
1165
1166 private Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
1167 Map<Class<? extends Annotation>, Annotation> declAnnos;
1168 if ((declAnnos = declaredAnnotations) == null) {
1169 synchronized (this) {
1170 if ((declAnnos = declaredAnnotations) == null) {
1171 Field root = this.root;
1172 if (root != null) {
1173 declAnnos = root.declaredAnnotations();
1174 } else {
1175 declAnnos = AnnotationParser.parseAnnotations(
1176 annotations,
1177 SharedSecrets.getJavaLangAccess()
1178 .getConstantPool(getDeclaringClass()),
1179 getDeclaringClass());
1180 }
1181 declaredAnnotations = declAnnos;
1182 }
1183 }
1184 }
1185 return declAnnos;
1186 }
1187
1188 private native byte[] getTypeAnnotationBytes0();
1189
1190 /**
1191 * Returns an AnnotatedType object that represents the use of a type to specify
1192 * the declared type of the field represented by this Field.
1193 * @return an object representing the declared type of the field
1194 * represented by this Field
1195 *
1196 * @since 1.8
1197 */
1198 public AnnotatedType getAnnotatedType() {
1199 return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),
1200 SharedSecrets.getJavaLangAccess().
1201 getConstantPool(getDeclaringClass()),
1202 this,
1203 getDeclaringClass(),
1204 getGenericType(),
1205 TypeAnnotation.TypeAnnotationTarget.FIELD);
1206 }
1207 }
1208