org.fife.rsta.ac.java.classreader.FieldInfo Maven / Gradle / Ivy
/* * 03/21/2010 * * Copyright (C) 2010 Robert Futrell * robert_futrell at users.sourceforge.net * http://fifesoft.com/rsyntaxtextarea * * This library is distributed under a modified BSD license. See the included * RSTALanguageSupport.License.txt file for details. */ package org.fife.rsta.ac.java.classreader; import java.io.*; import java.util.*; import org.fife.rsta.ac.java.classreader.attributes.*; import org.fife.rsta.ac.java.classreader.constantpool.ConstantUtf8Info; /** * Represents a "field_info" structure as defined by the Java VM spec. * * @author Robert Futrell * @version 1.0 */ public class FieldInfo extends MemberInfo { /** * Index into the constant pool of a {@link ConstantUtf8Info} structure * representing the field name, as a simple name. */ private int nameIndex; // u2 /** * Index into the constant pool of a {@link ConstantUtf8Info} structure * representing a valid field descriptor. */ private int descriptorIndex; // u2 /** * An array of attributes of this field. */ private List
structure from the specified input * stream. * * @param cf The class file containing this field. * @param in The input stream to read from. * @return The field information read. * @throws IOException If an IO error occurs. */ public static FieldInfo read(ClassFile cf, DataInputStream in) throws IOException { FieldInfo info = new FieldInfo(cf, in.readUnsignedShort(), in.readUnsignedShort(), in.readUnsignedShort()); int attrCount = in.readUnsignedShort(); for (int i=0; iattributes; public static final String CONSTANT_VALUE = "ConstantValue"; /** * Constructor. * * @param cf The class file being parsed. * @param accessFlags The access flags. * @param nameIndex The name index. * @param descriptorIndex The descriptor index. * @see AccessFlags */ public FieldInfo(ClassFile cf, int accessFlags, int nameIndex, int descriptorIndex) { super(cf, accessFlags); this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; attributes = new ArrayList<>(1); // Usually 0 or 1? } /** * Adds the specified attribute to this field. * * @param info Information about the attribute. */ public void addAttribute(AttributeInfo info) { attributes.add(info); } /** * Returns the specified attribute. * * @param index The index of the attribute. * @return The attribute. */ public AttributeInfo getAttribute(int index) { return attributes.get(index); } /** * Returns the number of attributes of this field. * * @return The number of attributes. */ public int getAttributeCount() { return attributes.size(); } /** * Returns this constant value as a string. * * @return A string representation of this constant value, or * {@code null} if it isn't one. */ public String getConstantValueAsString() { ConstantValue cv = getConstantValueAttributeInfo(); return cv==null ? null : cv.getConstantValueAsString(); } /** * Returns the {@link ConstantValue} attribute info for this field, if any. * * @return The ConstantValue
attribute, ornull
* if there isn't one. */ private ConstantValue getConstantValueAttributeInfo() { for (int i=0; iFieldInfo null if it was known * to be unimportant for our purposes. * @throws IOException If an IO error occurs. */ private AttributeInfo readAttribute(DataInputStream in) throws IOException { AttributeInfo ai; int attributeNameIndex = in.readUnsignedShort(); int attributeLength = in.readInt(); String attrName = cf.getUtf8ValueFromConstantPool(attributeNameIndex); if (CONSTANT_VALUE.equals(attrName)) { // 4.7.2 int constantValueIndex = in.readUnsignedShort(); ai = new ConstantValue(cf, constantValueIndex); } // Attributes common to all members, or unhandled attributes. else { ai = super.readAttribute(in, attrName, attributeLength); } return ai; } }