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 }