1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.bcel.classfile;
21
22 import java.io.DataInput;
23 import java.io.DataOutputStream;
24 import java.io.IOException;
25 import java.util.Arrays;
26
27 import org.apache.bcel.Const;
28 import org.apache.bcel.util.Args;
29 import org.apache.commons.lang3.ArrayUtils;
30
31
32
33
34
35
36
37
38 public final class NestMembers extends Attribute {
39
40 private int[] classes;
41
42
43
44
45
46
47
48
49
50
51 NestMembers(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException {
52 this(nameIndex, length, (int[]) null, constantPool);
53 final int classCount = input.readUnsignedShort();
54 classes = new int[classCount];
55 for (int i = 0; i < classCount; i++) {
56 classes[i] = input.readUnsignedShort();
57 }
58 }
59
60
61
62
63
64
65
66 public NestMembers(final int nameIndex, final int length, final int[] classes, final ConstantPool constantPool) {
67 super(Const.ATTR_NEST_MEMBERS, nameIndex, length, constantPool);
68 this.classes = ArrayUtils.nullToEmpty(classes);
69 Args.requireU2(this.classes.length, "classes.length");
70 }
71
72
73
74
75
76
77
78 public NestMembers(final NestMembers c) {
79 this(c.getNameIndex(), c.getLength(), c.getClasses(), c.getConstantPool());
80 }
81
82
83
84
85
86
87
88 @Override
89 public void accept(final Visitor v) {
90 v.visitNestMembers(this);
91 }
92
93
94
95
96 @Override
97 public Attribute copy(final ConstantPool constantPool) {
98 final NestMembers c = (NestMembers) clone();
99 if (classes.length > 0) {
100 c.classes = classes.clone();
101 }
102 c.setConstantPool(constantPool);
103 return c;
104 }
105
106
107
108
109
110
111
112 @Override
113 public void dump(final DataOutputStream file) throws IOException {
114 super.dump(file);
115 file.writeShort(classes.length);
116 for (final int index : classes) {
117 file.writeShort(index);
118 }
119 }
120
121
122
123
124 public int[] getClasses() {
125 return classes;
126 }
127
128
129
130
131 public String[] getClassNames() {
132 final String[] names = new String[classes.length];
133 Arrays.setAll(names, i -> Utility.pathToPackage(super.getConstantPool().getConstantString(classes[i], Const.CONSTANT_Class)));
134 return names;
135 }
136
137
138
139
140 public int getNumberClasses() {
141 return classes.length;
142 }
143
144
145
146
147 public void setClasses(final int[] classes) {
148 this.classes = ArrayUtils.nullToEmpty(classes);
149 }
150
151
152
153
154 @Override
155 public String toString() {
156 final StringBuilder buf = new StringBuilder();
157 buf.append("NestMembers(");
158 buf.append(classes.length);
159 buf.append("):\n");
160 for (final int index : classes) {
161 final String className = super.getConstantPool().getConstantString(index, Const.CONSTANT_Class);
162 buf.append(" ").append(Utility.compactClassName(className, false)).append("\n");
163 }
164 return buf.substring(0, buf.length() - 1);
165 }
166 }