001 package serp.bytecode.lowlevel;
002
003 import java.io.*;
004
005 /**
006 * Base class for field, method, and interface method constant pool
007 * entries. All complex entries reference the {@link ClassEntry} of the
008 * class that owns the entity and a {@link NameAndTypeEntry} describing
009 * the entity.
010 *
011 * @author Abe White
012 */
013 public abstract class ComplexEntry extends Entry {
014 private int _classIndex = 0;
015 private int _nameAndTypeIndex = 0;
016
017 /**
018 * Default constructor.
019 */
020 public ComplexEntry() {
021 }
022
023 /**
024 * Constructor.
025 *
026 * @param classIndex the constant pool index of the
027 * {@link ClassEntry} describing the owner of this entity
028 * @param nameAndTypeIndex the constant pool index of the
029 * {@link NameAndTypeEntry} describing this entity
030 */
031 public ComplexEntry(int classIndex, int nameAndTypeIndex) {
032 _classIndex = classIndex;
033 _nameAndTypeIndex = nameAndTypeIndex;
034 }
035
036 /**
037 * Return the constant pool index of the {@link ClassEntry} describing
038 * the owning class of this entity. Defaults to 0.
039 */
040 public int getClassIndex() {
041 return _classIndex;
042 }
043
044 /**
045 * Set the constant pool index of the {@link ClassEntry} describing
046 * the owning class of this entity.
047 */
048 public void setClassIndex(int classIndex) {
049 Object key = beforeModify();
050 _classIndex = classIndex;
051 afterModify(key);
052 }
053
054 /**
055 * Return the referenced {@link ClassEntry}. This method can only
056 * be run for entries that have been added to a constant pool.
057 */
058 public ClassEntry getClassEntry() {
059 return (ClassEntry) getPool().getEntry(_classIndex);
060 }
061
062 /**
063 * Return the constant pool index of the {@link NameAndTypeEntry}
064 * describing this entity.
065 */
066 public int getNameAndTypeIndex() {
067 return _nameAndTypeIndex;
068 }
069
070 /**
071 * Set the constant pool index of the {@link NameAndTypeEntry}
072 * describing this entity.
073 */
074 public void setNameAndTypeIndex(int nameAndTypeIndex) {
075 Object key = beforeModify();
076 _nameAndTypeIndex = nameAndTypeIndex;
077 afterModify(key);
078 }
079
080 /**
081 * Return the referenced {@link NameAndTypeEntry}. This method can only
082 * be run for entries that have been added to a constant pool.
083 */
084 public NameAndTypeEntry getNameAndTypeEntry() {
085 return (NameAndTypeEntry) getPool().getEntry(_nameAndTypeIndex);
086 }
087
088 void readData(DataInput in) throws IOException {
089 _classIndex = in.readUnsignedShort();
090 _nameAndTypeIndex = in.readUnsignedShort();
091 }
092
093 void writeData(DataOutput out) throws IOException {
094 out.writeShort(_classIndex);
095 out.writeShort(_nameAndTypeIndex);
096 }
097 }