1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.bcel.classfile;
20
21 import java.io.DataInput;
22 import java.io.DataOutputStream;
23 import java.io.IOException;
24
25 import org.apache.bcel.Const;
26
27
28
29
30
31
32
33 public final class InnerClass implements Cloneable, Node {
34
35 private int innerClassIndex;
36 private int outerClassIndex;
37 private int innerNameIndex;
38 private int innerAccessFlags;
39
40
41
42
43
44
45
46 InnerClass(final DataInput file) throws IOException {
47 this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort());
48 }
49
50
51
52
53
54
55 public InnerClass(final InnerClass c) {
56 this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(), c.getInnerAccessFlags());
57 }
58
59
60
61
62
63
64
65 public InnerClass(final int innerClassIndex, final int outerClassIndex, final int innerNameIndex, final int innerAccessFlags) {
66 this.innerClassIndex = innerClassIndex;
67 this.outerClassIndex = outerClassIndex;
68 this.innerNameIndex = innerNameIndex;
69 this.innerAccessFlags = innerAccessFlags;
70 }
71
72
73
74
75
76
77
78 @Override
79 public void accept(final Visitor v) {
80 v.visitInnerClass(this);
81 }
82
83
84
85
86 public InnerClass copy() {
87 try {
88 return (InnerClass) clone();
89 } catch (final CloneNotSupportedException e) {
90
91 }
92 return null;
93 }
94
95
96
97
98
99
100
101 public void dump(final DataOutputStream file) throws IOException {
102 file.writeShort(innerClassIndex);
103 file.writeShort(outerClassIndex);
104 file.writeShort(innerNameIndex);
105 file.writeShort(innerAccessFlags);
106 }
107
108
109
110
111 public int getInnerAccessFlags() {
112 return innerAccessFlags;
113 }
114
115
116
117
118 public int getInnerClassIndex() {
119 return innerClassIndex;
120 }
121
122
123
124
125 public int getInnerNameIndex() {
126 return innerNameIndex;
127 }
128
129
130
131
132 public int getOuterClassIndex() {
133 return outerClassIndex;
134 }
135
136
137
138
139 public void setInnerAccessFlags(final int innerAccessFlags) {
140 this.innerAccessFlags = innerAccessFlags;
141 }
142
143
144
145
146 public void setInnerClassIndex(final int innerClassIndex) {
147 this.innerClassIndex = innerClassIndex;
148 }
149
150
151
152
153 public void setInnerNameIndex(final int innerNameIndex) {
154 this.innerNameIndex = innerNameIndex;
155 }
156
157
158
159
160 public void setOuterClassIndex(final int outerClassIndex) {
161 this.outerClassIndex = outerClassIndex;
162 }
163
164
165
166
167 @Override
168 public String toString() {
169 return "InnerClass(" + innerClassIndex + ", " + outerClassIndex + ", " + innerNameIndex + ", " + innerAccessFlags + ")";
170 }
171
172
173
174
175 public String toString(final ConstantPool constantPool) {
176 String outerClassName;
177 String innerClassName = constantPool.getConstantString(innerClassIndex, Const.CONSTANT_Class);
178 innerClassName = Utility.compactClassName(innerClassName, false);
179 if (outerClassIndex != 0) {
180 outerClassName = constantPool.getConstantString(outerClassIndex, Const.CONSTANT_Class);
181 outerClassName = " of class " + Utility.compactClassName(outerClassName, false);
182 } else {
183 outerClassName = "";
184 }
185 final String innerName;
186 if (innerNameIndex != 0) {
187 innerName = constantPool.getConstantUtf8(innerNameIndex).getBytes();
188 } else {
189 innerName = "(anonymous)";
190 }
191 String access = Utility.accessToString(innerAccessFlags, true);
192 access = access.isEmpty() ? "" : access + " ";
193 return " " + access + innerName + "=class " + innerClassName + outerClassName;
194 }
195 }