1 /*
   2  * Copyright (c) 2001, 2011, 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 class UnsafeFieldAccessorFactory {
  32     static FieldAccessor newFieldAccessor(Field field, boolean override) {
  33         Class<?> type = field.getType();
  34         boolean isStatic = Modifier.isStatic(field.getModifiers());
  35         boolean isFinal = Modifier.isFinal(field.getModifiers());
  36         boolean isVolatile = Modifier.isVolatile(field.getModifiers());
  37         boolean isQualified = isFinal || isVolatile;
  38         boolean isReadOnly = isFinal && (isStatic || !override);
  39         if (isStatic) {
  40             // This code path does not guarantee that the field's
  41             // declaring class has been initialized, but it must be
  42             // before performing reflective operations.
  43             UnsafeFieldAccessorImpl.unsafe.ensureClassInitialized(field.getDeclaringClass());
  44 
  45             if (!isQualified) {
  46                 if (type == Boolean.TYPE) {
  47                     return new UnsafeStaticBooleanFieldAccessorImpl(field);
  48                 } else if (type == Byte.TYPE) {
  49                     return new UnsafeStaticByteFieldAccessorImpl(field);
  50                 } else if (type == Short.TYPE) {
  51                     return new UnsafeStaticShortFieldAccessorImpl(field);
  52                 } else if (type == Character.TYPE) {
  53                     return new UnsafeStaticCharacterFieldAccessorImpl(field);
  54                 } else if (type == Integer.TYPE) {
  55                     return new UnsafeStaticIntegerFieldAccessorImpl(field);
  56                 } else if (type == Long.TYPE) {
  57                     return new UnsafeStaticLongFieldAccessorImpl(field);
  58                 } else if (type == Float.TYPE) {
  59                     return new UnsafeStaticFloatFieldAccessorImpl(field);
  60                 } else if (type == Double.TYPE) {
  61                     return new UnsafeStaticDoubleFieldAccessorImpl(field);
  62                 } else {
  63                     return new UnsafeStaticObjectFieldAccessorImpl(field);
  64                 }
  65             } else {
  66                 if (type == Boolean.TYPE) {
  67                     return new UnsafeQualifiedStaticBooleanFieldAccessorImpl(field, isReadOnly);
  68                 } else if (type == Byte.TYPE) {
  69                     return new UnsafeQualifiedStaticByteFieldAccessorImpl(field, isReadOnly);
  70                 } else if (type == Short.TYPE) {
  71                     return new UnsafeQualifiedStaticShortFieldAccessorImpl(field, isReadOnly);
  72                 } else if (type == Character.TYPE) {
  73                     return new UnsafeQualifiedStaticCharacterFieldAccessorImpl(field, isReadOnly);
  74                 } else if (type == Integer.TYPE) {
  75                     return new UnsafeQualifiedStaticIntegerFieldAccessorImpl(field, isReadOnly);
  76                 } else if (type == Long.TYPE) {
  77                     return new UnsafeQualifiedStaticLongFieldAccessorImpl(field, isReadOnly);
  78                 } else if (type == Float.TYPE) {
  79                     return new UnsafeQualifiedStaticFloatFieldAccessorImpl(field, isReadOnly);
  80                 } else if (type == Double.TYPE) {
  81                     return new UnsafeQualifiedStaticDoubleFieldAccessorImpl(field, isReadOnly);
  82                 } else {
  83                     return new UnsafeQualifiedStaticObjectFieldAccessorImpl(field, isReadOnly);
  84                 }
  85             }
  86         } else {
  87             if (!isQualified) {
  88                 if (type == Boolean.TYPE) {
  89                     return new UnsafeBooleanFieldAccessorImpl(field);
  90                 } else if (type == Byte.TYPE) {
  91                     return new UnsafeByteFieldAccessorImpl(field);
  92                 } else if (type == Short.TYPE) {
  93                     return new UnsafeShortFieldAccessorImpl(field);
  94                 } else if (type == Character.TYPE) {
  95                     return new UnsafeCharacterFieldAccessorImpl(field);
  96                 } else if (type == Integer.TYPE) {
  97                     return new UnsafeIntegerFieldAccessorImpl(field);
  98                 } else if (type == Long.TYPE) {
  99                     return new UnsafeLongFieldAccessorImpl(field);
 100                 } else if (type == Float.TYPE) {
 101                     return new UnsafeFloatFieldAccessorImpl(field);
 102                 } else if (type == Double.TYPE) {
 103                     return new UnsafeDoubleFieldAccessorImpl(field);
 104                 } else {
 105                     return new UnsafeObjectFieldAccessorImpl(field);
 106                 }
 107             } else {
 108                 if (type == Boolean.TYPE) {
 109                     return new UnsafeQualifiedBooleanFieldAccessorImpl(field, isReadOnly);
 110                 } else if (type == Byte.TYPE) {
 111                     return new UnsafeQualifiedByteFieldAccessorImpl(field, isReadOnly);
 112                 } else if (type == Short.TYPE) {
 113                     return new UnsafeQualifiedShortFieldAccessorImpl(field, isReadOnly);
 114                 } else if (type == Character.TYPE) {
 115                     return new UnsafeQualifiedCharacterFieldAccessorImpl(field, isReadOnly);
 116                 } else if (type == Integer.TYPE) {
 117                     return new UnsafeQualifiedIntegerFieldAccessorImpl(field, isReadOnly);
 118                 } else if (type == Long.TYPE) {
 119                     return new UnsafeQualifiedLongFieldAccessorImpl(field, isReadOnly);
 120                 } else if (type == Float.TYPE) {
 121                     return new UnsafeQualifiedFloatFieldAccessorImpl(field, isReadOnly);
 122                 } else if (type == Double.TYPE) {
 123                     return new UnsafeQualifiedDoubleFieldAccessorImpl(field, isReadOnly);
 124                 } else {
 125                     return new UnsafeQualifiedObjectFieldAccessorImpl(field, isReadOnly);
 126                 }
 127             }
 128         }
 129     }
 130 }