/*
 * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

package sun.jvm.hotspot.oops;

import java.io.*;

import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.utilities.*;

// Super class for all fields in an object
public class Field {

  Field(FieldIdentifier id, long offset, boolean isVMField) {
    this.offset    = offset;
    this.id        = id;
    this.isVMField = isVMField;
  }

  
Constructor for fields that are named in an InstanceKlass's fields array (i.e., named, non-VM fields)
/** Constructor for fields that are named in an InstanceKlass's fields array (i.e., named, non-VM fields) */
Field(InstanceKlass holder, int fieldIndex) { this.holder = holder; this.fieldIndex = fieldIndex; offset = holder.getFieldOffset(fieldIndex); genericSignature = holder.getFieldGenericSignature(fieldIndex); name = holder.getFieldName(fieldIndex); id = new NamedFieldIdentifier(name.asString()); signature = holder.getFieldSignature(fieldIndex); fieldType = new FieldType(signature); short access = holder.getFieldAccessFlags(fieldIndex); accessFlags = new AccessFlags(access); } private Symbol name; private long offset; private FieldIdentifier id; private boolean isVMField; // Java fields only private InstanceKlass holder; private FieldType fieldType; private Symbol signature; private Symbol genericSignature; private AccessFlags accessFlags; private int fieldIndex;
Returns the byte offset of the field within the object or klass
/** Returns the byte offset of the field within the object or klass */
public long getOffset() { return offset; }
Returns the identifier of the field
/** Returns the identifier of the field */
public FieldIdentifier getID() { return id; } public Symbol getName() { return name; }
Indicates whether this is a VM field
/** Indicates whether this is a VM field */
public boolean isVMField() { return isVMField; }
Indicates whether this is a named field
/** Indicates whether this is a named field */
public boolean isNamedField() { return (id instanceof NamedFieldIdentifier); } public void printOn(PrintStream tty) { getID().printOn(tty); tty.print(" {" + getOffset() + "} :"); }
(Named, non-VM fields only) Returns the InstanceKlass containing this (static or non-static) field.
/** (Named, non-VM fields only) Returns the InstanceKlass containing this (static or non-static) field. */
public InstanceKlass getFieldHolder() { return holder; }
(Named, non-VM fields only) Returns the index in the fields TypeArray for this field. Equivalent to the "index" in the VM's fieldDescriptors.
/** (Named, non-VM fields only) Returns the index in the fields TypeArray for this field. Equivalent to the "index" in the VM's fieldDescriptors. */
public int getFieldIndex() { return fieldIndex; }
(Named, non-VM fields only) Retrieves the access flags.
/** (Named, non-VM fields only) Retrieves the access flags. */
public long getAccessFlags() { return accessFlags.getValue(); } public AccessFlags getAccessFlagsObj() { return accessFlags; }
(Named, non-VM fields only) Returns the type of this field.
/** (Named, non-VM fields only) Returns the type of this field. */
public FieldType getFieldType() { return fieldType; }
(Named, non-VM fields only) Returns the signature of this field.
/** (Named, non-VM fields only) Returns the signature of this field. */
public Symbol getSignature() { return signature; } public Symbol getGenericSignature() { return genericSignature; } public boolean hasInitialValue() { return holder.getFieldInitialValueIndex(fieldIndex) != 0; } // // Following acccessors are for named, non-VM fields only // public boolean isPublic() { return accessFlags.isPublic(); } public boolean isPrivate() { return accessFlags.isPrivate(); } public boolean isProtected() { return accessFlags.isProtected(); } public boolean isPackagePrivate() { return !isPublic() && !isPrivate() && !isProtected(); } public boolean isStatic() { return accessFlags.isStatic(); } public boolean isFinal() { return accessFlags.isFinal(); } public boolean isVolatile() { return accessFlags.isVolatile(); } public boolean isTransient() { return accessFlags.isTransient(); } public boolean isSynthetic() { return accessFlags.isSynthetic(); } public boolean isEnumConstant() { return accessFlags.isEnum(); } public boolean equals(Object obj) { if (obj == null) { return false; } if (! (obj instanceof Field)) { return false; } Field other = (Field) obj; return this.getFieldHolder().equals(other.getFieldHolder()) && this.getID().equals(other.getID()); } public int hashCode() { return getFieldHolder().hashCode() ^ getID().hashCode(); } }