1 /* 2 * Copyright (c) 1997, 2005, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // A fieldDescriptor describes the attributes of a single field (instance or class variable). 26 // It needs the class constant pool to work (because it only holds indices into the pool 27 // rather than the actual info). 28 29 class fieldDescriptor VALUE_OBJ_CLASS_SPEC { 30 private: 31 AccessFlags _access_flags; 32 int _name_index; 33 int _signature_index; 34 int _initial_value_index; 35 int _offset; 36 int _generic_signature_index; 37 int _index; // index into fields() array 38 constantPoolHandle _cp; 39 40 public: 41 symbolOop name() const { return _cp->symbol_at(_name_index); } 42 symbolOop signature() const { return _cp->symbol_at(_signature_index); } 43 klassOop field_holder() const { return _cp->pool_holder(); } 44 constantPoolOop constants() const { return _cp(); } 45 AccessFlags access_flags() const { return _access_flags; } 46 oop loader() const; 47 // Offset (in words) of field from start of instanceOop / klassOop 48 int offset() const { return _offset; } 49 symbolOop generic_signature() const { return (_generic_signature_index > 0 ? _cp->symbol_at(_generic_signature_index) : (symbolOop)NULL); } 50 int index() const { return _index; } 51 typeArrayOop annotations() const; 52 53 // Initial field value 54 bool has_initial_value() const { return _initial_value_index != 0; } 55 constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() 56 jint int_initial_value() const; 57 jlong long_initial_value() const; 58 jfloat float_initial_value() const; 59 jdouble double_initial_value() const; 60 oop string_initial_value(TRAPS) const; 61 62 // Field signature type 63 BasicType field_type() const { return FieldType::basic_type(signature()); } 64 65 // Access flags 66 bool is_public() const { return _access_flags.is_public(); } 67 bool is_private() const { return _access_flags.is_private(); } 68 bool is_protected() const { return _access_flags.is_protected(); } 69 bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } 70 71 bool is_static() const { return _access_flags.is_static(); } 72 bool is_final() const { return _access_flags.is_final(); } 73 bool is_volatile() const { return _access_flags.is_volatile(); } 74 bool is_transient() const { return _access_flags.is_transient(); } 75 76 bool is_synthetic() const { return _access_flags.is_synthetic(); } 77 78 bool is_field_access_watched() const { return _access_flags.is_field_access_watched(); } 79 bool is_field_modification_watched() const 80 { return _access_flags.is_field_modification_watched(); } 81 void set_is_field_access_watched(const bool value) 82 { _access_flags.set_is_field_access_watched(value); } 83 void set_is_field_modification_watched(const bool value) 84 { _access_flags.set_is_field_modification_watched(value); } 85 86 // Initialization 87 void initialize(klassOop k, int index); 88 89 // Print 90 void print_on(outputStream* st) const PRODUCT_RETURN; 91 void print_on_for(outputStream* st, oop obj) PRODUCT_RETURN; 92 };