Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/reflect/UnsafeFieldAccessorFactory.java
38829 views
/*1* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package sun.reflect;2627import java.lang.reflect.Field;28import java.lang.reflect.Modifier;2930class UnsafeFieldAccessorFactory {31static FieldAccessor newFieldAccessor(Field field, boolean override) {32Class<?> type = field.getType();33boolean isStatic = Modifier.isStatic(field.getModifiers());34boolean isFinal = Modifier.isFinal(field.getModifiers());35boolean isVolatile = Modifier.isVolatile(field.getModifiers());36boolean isQualified = isFinal || isVolatile;37boolean isReadOnly = isFinal && (isStatic || !override);38if (isStatic) {39// This code path does not guarantee that the field's40// declaring class has been initialized, but it must be41// before performing reflective operations.42UnsafeFieldAccessorImpl.unsafe.ensureClassInitialized(field.getDeclaringClass());4344if (!isQualified) {45if (type == Boolean.TYPE) {46return new UnsafeStaticBooleanFieldAccessorImpl(field);47} else if (type == Byte.TYPE) {48return new UnsafeStaticByteFieldAccessorImpl(field);49} else if (type == Short.TYPE) {50return new UnsafeStaticShortFieldAccessorImpl(field);51} else if (type == Character.TYPE) {52return new UnsafeStaticCharacterFieldAccessorImpl(field);53} else if (type == Integer.TYPE) {54return new UnsafeStaticIntegerFieldAccessorImpl(field);55} else if (type == Long.TYPE) {56return new UnsafeStaticLongFieldAccessorImpl(field);57} else if (type == Float.TYPE) {58return new UnsafeStaticFloatFieldAccessorImpl(field);59} else if (type == Double.TYPE) {60return new UnsafeStaticDoubleFieldAccessorImpl(field);61} else {62return new UnsafeStaticObjectFieldAccessorImpl(field);63}64} else {65if (type == Boolean.TYPE) {66return new UnsafeQualifiedStaticBooleanFieldAccessorImpl(field, isReadOnly);67} else if (type == Byte.TYPE) {68return new UnsafeQualifiedStaticByteFieldAccessorImpl(field, isReadOnly);69} else if (type == Short.TYPE) {70return new UnsafeQualifiedStaticShortFieldAccessorImpl(field, isReadOnly);71} else if (type == Character.TYPE) {72return new UnsafeQualifiedStaticCharacterFieldAccessorImpl(field, isReadOnly);73} else if (type == Integer.TYPE) {74return new UnsafeQualifiedStaticIntegerFieldAccessorImpl(field, isReadOnly);75} else if (type == Long.TYPE) {76return new UnsafeQualifiedStaticLongFieldAccessorImpl(field, isReadOnly);77} else if (type == Float.TYPE) {78return new UnsafeQualifiedStaticFloatFieldAccessorImpl(field, isReadOnly);79} else if (type == Double.TYPE) {80return new UnsafeQualifiedStaticDoubleFieldAccessorImpl(field, isReadOnly);81} else {82return new UnsafeQualifiedStaticObjectFieldAccessorImpl(field, isReadOnly);83}84}85} else {86if (!isQualified) {87if (type == Boolean.TYPE) {88return new UnsafeBooleanFieldAccessorImpl(field);89} else if (type == Byte.TYPE) {90return new UnsafeByteFieldAccessorImpl(field);91} else if (type == Short.TYPE) {92return new UnsafeShortFieldAccessorImpl(field);93} else if (type == Character.TYPE) {94return new UnsafeCharacterFieldAccessorImpl(field);95} else if (type == Integer.TYPE) {96return new UnsafeIntegerFieldAccessorImpl(field);97} else if (type == Long.TYPE) {98return new UnsafeLongFieldAccessorImpl(field);99} else if (type == Float.TYPE) {100return new UnsafeFloatFieldAccessorImpl(field);101} else if (type == Double.TYPE) {102return new UnsafeDoubleFieldAccessorImpl(field);103} else {104return new UnsafeObjectFieldAccessorImpl(field);105}106} else {107if (type == Boolean.TYPE) {108return new UnsafeQualifiedBooleanFieldAccessorImpl(field, isReadOnly);109} else if (type == Byte.TYPE) {110return new UnsafeQualifiedByteFieldAccessorImpl(field, isReadOnly);111} else if (type == Short.TYPE) {112return new UnsafeQualifiedShortFieldAccessorImpl(field, isReadOnly);113} else if (type == Character.TYPE) {114return new UnsafeQualifiedCharacterFieldAccessorImpl(field, isReadOnly);115} else if (type == Integer.TYPE) {116return new UnsafeQualifiedIntegerFieldAccessorImpl(field, isReadOnly);117} else if (type == Long.TYPE) {118return new UnsafeQualifiedLongFieldAccessorImpl(field, isReadOnly);119} else if (type == Float.TYPE) {120return new UnsafeQualifiedFloatFieldAccessorImpl(field, isReadOnly);121} else if (type == Double.TYPE) {122return new UnsafeQualifiedDoubleFieldAccessorImpl(field, isReadOnly);123} else {124return new UnsafeQualifiedObjectFieldAccessorImpl(field, isReadOnly);125}126}127}128}129}130131132