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.Iterator;
26 import java.util.stream.Stream;
27
28 import org.apache.bcel.Const;
29
30
31
32
33
34
35
36
37 public class BootstrapMethods extends Attribute implements Iterable<BootstrapMethod> {
38
39 private BootstrapMethod[] bootstrapMethods;
40
41
42
43
44
45
46
47 public BootstrapMethods(final BootstrapMethods c) {
48 this(c.getNameIndex(), c.getLength(), c.getBootstrapMethods(), c.getConstantPool());
49 }
50
51
52
53
54
55
56
57
58
59 public BootstrapMethods(final int nameIndex, final int length, final BootstrapMethod[] bootstrapMethods, final ConstantPool constantPool) {
60 super(Const.ATTR_BOOTSTRAP_METHODS, nameIndex, length, constantPool);
61 setBootstrapMethods(bootstrapMethods);
62 }
63
64
65
66
67
68
69
70
71
72
73 BootstrapMethods(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException {
74 this(nameIndex, length, (BootstrapMethod[]) null, constantPool);
75
76 final int numBootstrapMethods = input.readUnsignedShort();
77 bootstrapMethods = new BootstrapMethod[numBootstrapMethods];
78 for (int i = 0; i < numBootstrapMethods; i++) {
79 bootstrapMethods[i] = new BootstrapMethod(input);
80 }
81 }
82
83
84
85
86
87
88 @Override
89 public void accept(final Visitor v) {
90 v.visitBootstrapMethods(this);
91 }
92
93
94
95
96
97
98
99 @Override
100 public BootstrapMethods copy(final ConstantPool constantPool) {
101 final BootstrapMethods c = (BootstrapMethods) clone();
102 c.bootstrapMethods = new BootstrapMethod[bootstrapMethods.length];
103
104 for (int i = 0; i < bootstrapMethods.length; i++) {
105 c.bootstrapMethods[i] = bootstrapMethods[i].copy();
106 }
107 c.setConstantPool(constantPool);
108 return c;
109 }
110
111
112
113
114
115
116
117 @Override
118 public final void dump(final DataOutputStream file) throws IOException {
119 super.dump(file);
120
121 file.writeShort(bootstrapMethods.length);
122 for (final BootstrapMethod bootstrapMethod : bootstrapMethods) {
123 bootstrapMethod.dump(file);
124 }
125 }
126
127
128
129
130
131
132 public final BootstrapMethod[] getBootstrapMethods() {
133 return bootstrapMethods;
134 }
135
136 @Override
137 public Iterator<BootstrapMethod> iterator() {
138 return Stream.of(bootstrapMethods).iterator();
139 }
140
141
142
143
144
145
146 public final void setBootstrapMethods(final BootstrapMethod[] bootstrapMethods) {
147 this.bootstrapMethods = bootstrapMethods != null ? bootstrapMethods : BootstrapMethod.EMPTY_ARRAY;
148 }
149
150
151
152
153 @Override
154 public final String toString() {
155 final StringBuilder buf = new StringBuilder();
156 buf.append("BootstrapMethods(");
157 buf.append(bootstrapMethods.length);
158 buf.append("):");
159 for (int i = 0; i < bootstrapMethods.length; i++) {
160 buf.append("\n");
161 final int start = buf.length();
162 buf.append(" ").append(i).append(": ");
163 final int indentCount = buf.length() - start;
164 final String[] lines = bootstrapMethods[i].toString(super.getConstantPool()).split("\\r?\\n");
165 buf.append(lines[0]);
166 for (int j = 1; j < lines.length; j++) {
167 buf.append("\n").append(" ", 0, indentCount).append(lines[j]);
168 }
169 }
170 return buf.toString();
171 }
172 }