1 /*
2 * Copyright (c) 2001, 2021, 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 jdk.internal.reflect;
27
28 import java.lang.reflect.Field;
29 import java.lang.reflect.Modifier;
30 import jdk.internal.misc.Unsafe;
31
32 /** Base class for jdk.internal.misc.Unsafe-based FieldAccessors. The
33 observation is that there are only nine types of fields from the
34 standpoint of reflection code: the eight primitive types and
35 Object. Using class Unsafe instead of generated bytecodes saves
36 memory and loading time for the dynamically-generated
37 FieldAccessors. */
38
39 abstract class UnsafeFieldAccessorImpl extends FieldAccessorImpl {
40 static final Unsafe unsafe = Unsafe.getUnsafe();
41
42 protected final long fieldOffset;
43 protected final boolean isFinal;
44
45 UnsafeFieldAccessorImpl(Field field) {
46 super(field);
47 int mods = field.getModifiers();
48 this.isFinal = Modifier.isFinal(mods);
49 if (Modifier.isStatic(mods))
50 fieldOffset = unsafe.staticFieldOffset(field);
51 else
52 fieldOffset = unsafe.objectFieldOffset(field);
53 }
54 }
|
1 /*
2 * Copyright (c) 2001, 2022, 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 jdk.internal.reflect;
27
28 import java.lang.reflect.Field;
29 import java.lang.reflect.Modifier;
30
31 import jdk.internal.value.PrimitiveClass;
32 import jdk.internal.misc.Unsafe;
33
34 /** Base class for jdk.internal.misc.Unsafe-based FieldAccessors. The
35 observation is that there are only nine types of fields from the
36 standpoint of reflection code: the eight primitive types and
37 Object. Using class Unsafe instead of generated bytecodes saves
38 memory and loading time for the dynamically-generated
39 FieldAccessors. */
40
41 abstract class UnsafeFieldAccessorImpl extends FieldAccessorImpl {
42 static final Unsafe unsafe = Unsafe.getUnsafe();
43
44 protected final long fieldOffset;
45 protected final boolean isFinal;
46
47 UnsafeFieldAccessorImpl(Field field) {
48 super(field);
49 int mods = field.getModifiers();
50 this.isFinal = Modifier.isFinal(mods);
51 if (Modifier.isStatic(mods))
52 fieldOffset = unsafe.staticFieldOffset(field);
53 else
54 fieldOffset = unsafe.objectFieldOffset(field);
55 }
56
57 protected boolean isFlattened() {
58 return unsafe.isFlattened(field);
59 }
60
61 protected boolean canBeNull() {
62 return !PrimitiveClass.isPrimitiveClass(field.getType()) ||
63 PrimitiveClass.isPrimaryType(field.getType());
64 }
65
66 protected Object checkValue(Object value) {
67 if (!canBeNull() && value == null)
68 throw new NullPointerException(field + " cannot be set to null");
69
70 if (value != null) {
71 Class<?> type = value.getClass();
72 if (PrimitiveClass.isPrimitiveClass(type)) {
73 type = PrimitiveClass.asValueType(type);
74 }
75 if (!field.getType().isInstance(value)) {
76 throwSetIllegalArgumentException(value);
77 }
78 }
79 return value;
80 }
81
82 }
|