1 16 17 package org.cojen.classfile.attribute; 18 19 import java.util.ArrayList ; 20 import java.util.List ; 21 import java.io.DataInput ; 22 import java.io.DataOutput ; 23 import java.io.IOException ; 24 import org.cojen.classfile.Attribute; 25 import org.cojen.classfile.ConstantPool; 26 import org.cojen.classfile.Modifiers; 27 import org.cojen.classfile.constant.ConstantClassInfo; 28 import org.cojen.classfile.constant.ConstantUTFInfo; 29 30 37 public class InnerClassesAttr extends Attribute { 38 39 private List mInnerClasses = new ArrayList (); 40 41 public InnerClassesAttr(ConstantPool cp) { 42 super(cp, INNER_CLASSES); 43 } 44 45 public InnerClassesAttr(ConstantPool cp, String name) { 46 super(cp, name); 47 } 48 49 public InnerClassesAttr(ConstantPool cp, String name, int length, DataInput din) 50 throws IOException 51 { 52 super(cp, name); 53 54 int size = din.readUnsignedShort(); 55 for (int i=0; i<size; i++) { 56 int inner_index = din.readUnsignedShort(); 57 int outer_index = din.readUnsignedShort(); 58 int name_index = din.readUnsignedShort(); 59 int af = din.readUnsignedShort(); 60 61 ConstantClassInfo inner; 62 if (inner_index == 0) { 63 inner = null; 64 } else { 65 inner = (ConstantClassInfo)cp.getConstant(inner_index); 66 } 67 68 ConstantClassInfo outer; 69 if (outer_index == 0) { 70 outer = null; 71 } else { 72 outer = (ConstantClassInfo)cp.getConstant(outer_index); 73 } 74 75 ConstantUTFInfo innerName; 76 if (name_index == 0) { 77 innerName = null; 78 } else { 79 innerName = (ConstantUTFInfo)cp.getConstant(name_index); 80 } 81 82 mInnerClasses.add(new Info(inner, outer, innerName, Modifiers.getInstance(af))); 83 } 84 } 85 86 92 public void addInnerClass(String inner, 93 String outer, 94 String name, 95 Modifiers modifiers) { 96 97 ConstantClassInfo innerInfo = getConstantPool().addConstantClass(inner); 98 ConstantClassInfo outerInfo; 99 if (outer == null) { 100 outerInfo = null; 101 } else { 102 outerInfo = getConstantPool().addConstantClass(outer); 103 } 104 105 ConstantUTFInfo nameInfo; 106 if (name == null) { 107 nameInfo = null; 108 } else { 109 nameInfo = getConstantPool().addConstantUTF(name); 110 } 111 112 mInnerClasses.add(new Info(innerInfo, outerInfo, nameInfo, modifiers)); 113 } 114 115 public Info[] getInnerClassesInfo() { 116 Info[] infos = new Info[mInnerClasses.size()]; 117 return (Info[])mInnerClasses.toArray(infos); 118 } 119 120 public int getLength() { 121 return 2 + 8 * mInnerClasses.size(); 122 } 123 124 public void writeDataTo(DataOutput dout) throws IOException { 125 int size = mInnerClasses.size(); 126 dout.writeShort(size); 127 for (int i=0; i<size; i++) { 128 ((Info)mInnerClasses.get(i)).writeTo(dout); 129 } 130 } 131 132 public static class Info { 133 private ConstantClassInfo mInner; 134 private ConstantClassInfo mOuter; 135 private ConstantUTFInfo mName; 136 private Modifiers mModifiers; 137 138 Info(ConstantClassInfo inner, 139 ConstantClassInfo outer, 140 ConstantUTFInfo name, 141 Modifiers modifiers) { 142 143 mInner = inner; 144 mOuter = outer; 145 mName = name; 146 mModifiers = modifiers; 147 } 148 149 152 public ConstantClassInfo getInnerClass() { 153 return mInner; 154 } 155 156 159 public ConstantClassInfo getOuterClass() { 160 return mOuter; 161 } 162 163 166 public ConstantUTFInfo getInnerClassName() { 167 return mName; 168 } 169 170 173 public Modifiers getModifiers() { 174 return mModifiers; 175 } 176 177 public void writeTo(DataOutput dout) throws IOException { 178 if (mInner == null) { 179 dout.writeShort(0); 180 } else { 181 dout.writeShort(mInner.getIndex()); 182 } 183 184 if (mOuter == null) { 185 dout.writeShort(0); 186 } else { 187 dout.writeShort(mOuter.getIndex()); 188 } 189 190 if (mName == null) { 191 dout.writeShort(0); 192 } else { 193 dout.writeShort(mName.getIndex()); 194 } 195 196 dout.writeShort(mModifiers.getBitmask()); 197 } 198 } 199 } 200 | Popular Tags |