blob: c49aaf6d7cf5c7c3b9a2505b96cc783dba0e1d15 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2001-2005 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.reflect;
27
28import java.lang.reflect.Field;
29import java.lang.reflect.Modifier;
30import sun.misc.Unsafe;
31
32/** Base class for sun.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
39abstract class UnsafeFieldAccessorImpl extends FieldAccessorImpl {
40 static final Unsafe unsafe = Unsafe.getUnsafe();
41
42 protected final Field field;
43 protected final int fieldOffset;
44 protected final boolean isFinal;
45
46 UnsafeFieldAccessorImpl(Field field) {
47 this.field = field;
48 fieldOffset = unsafe.fieldOffset(field);
49 isFinal = Modifier.isFinal(field.getModifiers());
50 }
51
52 protected void ensureObj(Object o) {
53 // NOTE: will throw NullPointerException, as specified, if o is null
54 if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) {
55 throwSetIllegalArgumentException(o);
56 }
57 }
58
59 private String getQualifiedFieldName() {
60 return field.getDeclaringClass().getName() + "." +field.getName();
61 }
62
63 protected IllegalArgumentException newGetIllegalArgumentException(String type) {
64 return new IllegalArgumentException(
65 "Attempt to get "+field.getType().getName()+" field \"" +
66 getQualifiedFieldName() + "\" with illegal data type conversion to "+type
67 );
68 }
69
70 protected void throwFinalFieldIllegalAccessException(String attemptedType,
71 String attemptedValue)
72 throws IllegalAccessException {
73 throw new IllegalAccessException(getSetMessage(attemptedType, attemptedValue));
74
75 }
76 protected void throwFinalFieldIllegalAccessException(Object o) throws IllegalAccessException {
77 throwFinalFieldIllegalAccessException(o != null ? o.getClass().getName() : "", "");
78 }
79
80 protected void throwFinalFieldIllegalAccessException(boolean z) throws IllegalAccessException {
81 throwFinalFieldIllegalAccessException("boolean", Boolean.toString(z));
82 }
83
84 protected void throwFinalFieldIllegalAccessException(char b) throws IllegalAccessException {
85 throwFinalFieldIllegalAccessException("char", Character.toString(b));
86 }
87
88 protected void throwFinalFieldIllegalAccessException(byte b) throws IllegalAccessException {
89 throwFinalFieldIllegalAccessException("byte", Byte.toString(b));
90 }
91
92 protected void throwFinalFieldIllegalAccessException(short b) throws IllegalAccessException {
93 throwFinalFieldIllegalAccessException("short", Short.toString(b));
94 }
95
96 protected void throwFinalFieldIllegalAccessException(int i) throws IllegalAccessException {
97 throwFinalFieldIllegalAccessException("int", Integer.toString(i));
98 }
99
100 protected void throwFinalFieldIllegalAccessException(long i) throws IllegalAccessException {
101 throwFinalFieldIllegalAccessException("long", Long.toString(i));
102 }
103
104 protected void throwFinalFieldIllegalAccessException(float f) throws IllegalAccessException {
105 throwFinalFieldIllegalAccessException("float", Float.toString(f));
106 }
107
108 protected void throwFinalFieldIllegalAccessException(double f) throws IllegalAccessException {
109 throwFinalFieldIllegalAccessException("double", Double.toString(f));
110 }
111
112 protected IllegalArgumentException newGetBooleanIllegalArgumentException() {
113 return newGetIllegalArgumentException("boolean");
114 }
115
116 protected IllegalArgumentException newGetByteIllegalArgumentException() {
117 return newGetIllegalArgumentException("byte");
118 }
119
120 protected IllegalArgumentException newGetCharIllegalArgumentException() {
121 return newGetIllegalArgumentException("char");
122 }
123
124 protected IllegalArgumentException newGetShortIllegalArgumentException() {
125 return newGetIllegalArgumentException("short");
126 }
127
128 protected IllegalArgumentException newGetIntIllegalArgumentException() {
129 return newGetIllegalArgumentException("int");
130 }
131
132 protected IllegalArgumentException newGetLongIllegalArgumentException() {
133 return newGetIllegalArgumentException("long");
134 }
135
136 protected IllegalArgumentException newGetFloatIllegalArgumentException() {
137 return newGetIllegalArgumentException("float");
138 }
139
140 protected IllegalArgumentException newGetDoubleIllegalArgumentException() {
141 return newGetIllegalArgumentException("double");
142 }
143
144 protected String getSetMessage(String attemptedType, String attemptedValue) {
145 String err = "Can not set";
146 if (Modifier.isStatic(field.getModifiers()))
147 err += " static";
148 if (isFinal)
149 err += " final";
150 err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to ";
151 if (attemptedValue.length() > 0) {
152 err += "(" + attemptedType + ")" + attemptedValue;
153 } else {
154 if (attemptedType.length() > 0)
155 err += attemptedType;
156 else
157 err += "null value";
158 }
159 return err;
160 }
161
162 protected void throwSetIllegalArgumentException(String attemptedType,
163 String attemptedValue) {
164 throw new IllegalArgumentException(getSetMessage(attemptedType,attemptedValue));
165 }
166
167 protected void throwSetIllegalArgumentException(Object o) {
168 throwSetIllegalArgumentException(o != null ? o.getClass().getName() : "", "");
169 }
170
171 protected void throwSetIllegalArgumentException(boolean b) {
172 throwSetIllegalArgumentException("boolean", Boolean.toString(b));
173 }
174
175 protected void throwSetIllegalArgumentException(byte b) {
176 throwSetIllegalArgumentException("byte", Byte.toString(b));
177 }
178
179 protected void throwSetIllegalArgumentException(char c) {
180 throwSetIllegalArgumentException("char", Character.toString(c));
181 }
182
183 protected void throwSetIllegalArgumentException(short s) {
184 throwSetIllegalArgumentException("short", Short.toString(s));
185 }
186
187 protected void throwSetIllegalArgumentException(int i) {
188 throwSetIllegalArgumentException("int", Integer.toString(i));
189 }
190
191 protected void throwSetIllegalArgumentException(long l) {
192 throwSetIllegalArgumentException("long", Long.toString(l));
193 }
194
195 protected void throwSetIllegalArgumentException(float f) {
196 throwSetIllegalArgumentException("float", Float.toString(f));
197 }
198
199 protected void throwSetIllegalArgumentException(double d) {
200 throwSetIllegalArgumentException("double", Double.toString(d));
201 }
202
203}