/* --- Copyright (c) Chris Rathman 1999. All rights reserved. ----------------- > File: jasper/Field_Collection.java > Purpose: Fields declared by the class - Class properties > Author: Chris Rathman, 12 June 1999 > Version: 1.00 */ package jasper; import java.io.*; /*======================================================================= = Class: Field_Collection = = = = Desc: Collection of Fields declared by the class = =======================================================================*/ class Field_Collection { private int count; // number of fields declared private Field[] fields; // fields declared by the class - class properties /*----------------------------------------------------------------------- - Method: Class Constructor - - - - Desc: read in the field definitions from input stream - -----------------------------------------------------------------------*/ Field_Collection(DataInputStream ios, Pool_Collection pool) throws IOException { // get the number of fields count = ios.readShort(); // read in the fields fields = new Field[count]; for (int i = 0; i < count; i++) fields[i] = new Field(ios, pool); } /*----------------------------------------------------------------------- - Method: jasmin - - - - Desc: output the .field directives to the jasmin file - -----------------------------------------------------------------------*/ void jasmin(PrintStream out) throws IOException { for (int i = 0; i < count; i++) fields[i].jasmin(out); } /*----------------------------------------------------------------------- - Method: browseFields - - - - Desc: return array of strings representing the fields - -----------------------------------------------------------------------*/ String[] browseFields(String thisClass){ String[] retVal = new String[count]; for (int i = 0; i < count; i++) { retVal[i] = fields[i].browseField(thisClass); } return retVal; } } /*======================================================================= = Class: Field = = = = Desc: Individual Field declared by the class = =======================================================================*/ class Field { private Pool_Collection pool; // constant pool table private int accessFlags; // field access flags private int nameIndex; // field name (index into constant pool table) private int descriptorIndex; // field type (index into constant pool table) private Attribute_Collection attributes; // field attributes: (ConstantValue, Synthetic, Deprecated) /*----------------------------------------------------------------------- - Method: Class Constructor - - - - Desc: read in the field definition from input stream - -----------------------------------------------------------------------*/ Field(DataInputStream ios, Pool_Collection pool) throws IOException { // save off the pool object for later reference this.pool = pool; // get the field access flags accessFlags = ios.readShort(); // get the index for the field name nameIndex = ios.readShort(); // get the index for the field type descriptor descriptorIndex = ios.readShort(); // read in the field attributes attributes = new Attribute_Collection(ios, pool); } /*----------------------------------------------------------------------- - Method: accessString - - - - Desc: build a string for the field access flags - -----------------------------------------------------------------------*/ private String accessString() { String s = ""; if ((accessFlags & 0x0001) > 0) s += "public "; if ((accessFlags & 0x0002) > 0) s += "private "; if ((accessFlags & 0x0004) > 0) s += "protected "; if ((accessFlags & 0x0008) > 0) s += "static "; if ((accessFlags & 0x0010) > 0) s += "final "; if ((accessFlags & 0x0040) > 0) s += "volatile "; if ((accessFlags & 0x0080) > 0) s += "transient "; return s; } /*----------------------------------------------------------------------- - Method: jasmin - - - - Desc: output the .field directive to the jasmin file - -----------------------------------------------------------------------*/ void jasmin(PrintStream out) throws IOException { out.println(ClassFile.pad(".field", ClassFile.SPACER) + accessString() + pool.toString(nameIndex) + " " + pool.toString(descriptorIndex) + attributes.jasminConstantValue()); } /*----------------------------------------------------------------------- - Method: browseField - - - - Desc: return string representing the field - -----------------------------------------------------------------------*/ String browseField(String thisClass) { return attributes.browseDeprecated() + attributes.browseSynthetic() + accessString() + pool.browseDescriptor(descriptorIndex) + " " + thisClass + "." + pool.browseString(nameIndex) + attributes.browseConstantValue(); } }