19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.javap;
27
28 import java.net.URI;
29 import java.text.DateFormat;
30 import java.util.Collection;
31 import java.util.Date;
32 import java.util.List;
33 import java.util.Set;
34
35 import java.lang.constant.ClassDesc;
36 import java.lang.reflect.Modifier;
37 import java.util.ArrayList;
38 import java.util.LinkedHashSet;
39 import java.lang.classfile.AccessFlags;
40 import java.lang.classfile.Attributes;
41 import java.lang.classfile.ClassModel;
42 import java.lang.classfile.ClassSignature;
43 import java.lang.classfile.ClassFile;
44 import static java.lang.classfile.ClassFile.*;
45 import java.lang.classfile.constantpool.*;
46 import java.lang.classfile.FieldModel;
47 import java.lang.classfile.MethodModel;
48 import java.lang.classfile.MethodSignature;
49 import java.lang.classfile.Signature;
50 import java.lang.classfile.attribute.CodeAttribute;
51 import java.lang.classfile.attribute.SignatureAttribute;
52
53 /*
54 * The main javap class to write the contents of a class file as text.
55 *
56 * <p><b>This is NOT part of any supported API.
57 * If you write code that depends on this, you do so at your own risk.
58 * This code and its internal interfaces are subject to change or
131 println("Last modified " + df.format(lm));
132 }
133 } else if (size > 0) {
134 println("Size " + size + " bytes");
135 }
136 if (digestName != null && digest != null) {
137 StringBuilder sb = new StringBuilder();
138 for (byte b: digest)
139 sb.append(String.format("%02x", b));
140 println(digestName + " checksum " + sb);
141 }
142 }
143
144 cm.findAttribute(Attributes.SOURCE_FILE).ifPresent(sfa ->
145 println("Compiled from \"" + sfa.sourceFile().stringValue() + "\""));
146
147 if (options.sysInfo || options.verbose) {
148 indent(-1);
149 }
150
151 writeModifiers(getClassModifiers(cm.flags().flagsMask()));
152
153 if ((classModel.flags().flagsMask() & ACC_MODULE) != 0) {
154 var attr = classModel.findAttribute(Attributes.MODULE);
155 if (attr.isPresent()) {
156 var modAttr = attr.get();
157 if ((modAttr.moduleFlagsMask() & ACC_OPEN) != 0) {
158 print("open ");
159 }
160 print("module ");
161 print(() -> modAttr.moduleName().name().stringValue());
162 if (modAttr.moduleVersion().isPresent()) {
163 print("@");
164 print(() -> modAttr.moduleVersion().get().stringValue());
165 }
166 } else {
167 // fallback for malformed class files
168 print("class ");
169 print(() -> getJavaName(classModel.thisClass().asInternalName()));
170 }
171 } else {
404 var a = f.findAttribute(Attributes.CONSTANT_VALUE);
405 if (a.isPresent()) {
406 print(" = ");
407 var cv = a.get();
408 print(() -> getConstantValue(f.fieldTypeSymbol(), cv.constant()));
409 }
410 }
411 print(";");
412 println();
413
414 indent(+1);
415
416 boolean showBlank = false;
417
418 if (options.showDescriptors) {
419 print("descriptor: ");println(() -> f.fieldType().stringValue());
420 }
421
422 if (options.verbose)
423 writeList(String.format("flags: (0x%04x) ", flags.flagsMask()),
424 flags.flags().stream().map(fl -> "ACC_" + fl.name()).toList(),
425 "\n");
426
427 if (options.showAllAttrs) {
428 attrWriter.write(f.attributes());
429 showBlank = true;
430 }
431
432 indent(-1);
433
434 if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables)
435 println();
436 }
437
438 protected void writeMethods() {
439 for (MethodModel m: classModel.methods())
440 writeMethod(m);
441 setPendingNewline(false);
442 }
443
444 private static final int DEFAULT_ALLOWED_MAJOR_VERSION = 52;
757 if (32 <= c && c <= 126 && c != quote && c != '\\')
758 return String.valueOf(c);
759 else switch (c) {
760 case '\b': return "\\b";
761 case '\n': return "\\n";
762 case '\t': return "\\t";
763 case '\f': return "\\f";
764 case '\r': return "\\r";
765 case '\\': return "\\\\";
766 case '\'': return "\\'";
767 case '\"': return "\\\"";
768 default: return String.format("\\u%04x", (int) c);
769 }
770 }
771
772 private static Set<String> getClassModifiers(int mask) {
773 return getModifiers(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0
774 ? mask & ~ACC_ABSTRACT : mask).flags());
775 }
776
777 private static Set<String> getMethodModifiers(int mask) {
778 return getModifiers(AccessFlags.ofMethod(mask).flags());
779 }
780
781 private static Set<String> getFieldModifiers(int mask) {
782 return getModifiers(AccessFlags.ofField(mask).flags());
783 }
784
785 private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags) {
786 Set<String> s = new LinkedHashSet<>();
787 for (var f : flags)
788 if (f.sourceModifier()) s.add(Modifier.toString(f.mask()));
789 return s;
790 }
791
792 private static Set<String> getClassFlags(int mask) {
793 return getFlags(mask, AccessFlags.ofClass(mask).flags());
794 }
795
796 private static Set<String> getMethodFlags(int mask) {
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.javap;
27
28 import java.net.URI;
29 import java.text.DateFormat;
30 import java.util.Collection;
31 import java.util.Date;
32 import java.util.List;
33 import java.util.Set;
34
35 import java.lang.constant.ClassDesc;
36 import java.lang.reflect.Modifier;
37 import java.util.ArrayList;
38 import java.util.LinkedHashSet;
39
40 import com.sun.tools.javac.code.Source;
41 import java.lang.classfile.AccessFlags;
42 import java.lang.classfile.Attributes;
43 import java.lang.classfile.ClassModel;
44 import java.lang.classfile.ClassSignature;
45 import java.lang.classfile.ClassFile;
46 import static java.lang.classfile.ClassFile.*;
47 import java.lang.classfile.constantpool.*;
48 import java.lang.classfile.FieldModel;
49 import java.lang.classfile.MethodModel;
50 import java.lang.classfile.MethodSignature;
51 import java.lang.classfile.Signature;
52 import java.lang.classfile.attribute.CodeAttribute;
53 import java.lang.classfile.attribute.SignatureAttribute;
54
55 /*
56 * The main javap class to write the contents of a class file as text.
57 *
58 * <p><b>This is NOT part of any supported API.
59 * If you write code that depends on this, you do so at your own risk.
60 * This code and its internal interfaces are subject to change or
133 println("Last modified " + df.format(lm));
134 }
135 } else if (size > 0) {
136 println("Size " + size + " bytes");
137 }
138 if (digestName != null && digest != null) {
139 StringBuilder sb = new StringBuilder();
140 for (byte b: digest)
141 sb.append(String.format("%02x", b));
142 println(digestName + " checksum " + sb);
143 }
144 }
145
146 cm.findAttribute(Attributes.SOURCE_FILE).ifPresent(sfa ->
147 println("Compiled from \"" + sfa.sourceFile().stringValue() + "\""));
148
149 if (options.sysInfo || options.verbose) {
150 indent(-1);
151 }
152
153 writeModifiers(getClassModifiers(cm.flags().flagsMask(), classModel.majorVersion(), classModel.minorVersion()));
154
155 if ((classModel.flags().flagsMask() & ACC_MODULE) != 0) {
156 var attr = classModel.findAttribute(Attributes.MODULE);
157 if (attr.isPresent()) {
158 var modAttr = attr.get();
159 if ((modAttr.moduleFlagsMask() & ACC_OPEN) != 0) {
160 print("open ");
161 }
162 print("module ");
163 print(() -> modAttr.moduleName().name().stringValue());
164 if (modAttr.moduleVersion().isPresent()) {
165 print("@");
166 print(() -> modAttr.moduleVersion().get().stringValue());
167 }
168 } else {
169 // fallback for malformed class files
170 print("class ");
171 print(() -> getJavaName(classModel.thisClass().asInternalName()));
172 }
173 } else {
406 var a = f.findAttribute(Attributes.CONSTANT_VALUE);
407 if (a.isPresent()) {
408 print(" = ");
409 var cv = a.get();
410 print(() -> getConstantValue(f.fieldTypeSymbol(), cv.constant()));
411 }
412 }
413 print(";");
414 println();
415
416 indent(+1);
417
418 boolean showBlank = false;
419
420 if (options.showDescriptors) {
421 print("descriptor: ");println(() -> f.fieldType().stringValue());
422 }
423
424 if (options.verbose)
425 writeList(String.format("flags: (0x%04x) ", flags.flagsMask()),
426 flags.flags().stream().map(fl -> "ACC_" + fl.toString()).toList(),
427 "\n");
428
429 if (options.showAllAttrs) {
430 attrWriter.write(f.attributes());
431 showBlank = true;
432 }
433
434 indent(-1);
435
436 if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables)
437 println();
438 }
439
440 protected void writeMethods() {
441 for (MethodModel m: classModel.methods())
442 writeMethod(m);
443 setPendingNewline(false);
444 }
445
446 private static final int DEFAULT_ALLOWED_MAJOR_VERSION = 52;
759 if (32 <= c && c <= 126 && c != quote && c != '\\')
760 return String.valueOf(c);
761 else switch (c) {
762 case '\b': return "\\b";
763 case '\n': return "\\n";
764 case '\t': return "\\t";
765 case '\f': return "\\f";
766 case '\r': return "\\r";
767 case '\\': return "\\\\";
768 case '\'': return "\\'";
769 case '\"': return "\\\"";
770 default: return String.format("\\u%04x", (int) c);
771 }
772 }
773
774 private static Set<String> getClassModifiers(int mask) {
775 return getModifiers(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0
776 ? mask & ~ACC_ABSTRACT : mask).flags());
777 }
778
779 private static Set<String> getClassModifiers(int mask, int majorVersion, int minorVersion) {
780 boolean previewClassFile = minorVersion == ClassFile.PREVIEW_MINOR_VERSION;
781 Set<String> result = getModifiers(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0
782 ? mask & ~ACC_ABSTRACT : mask).flags());
783 if ((mask & ACC_INTERFACE) == 0 && Source.isSupported(Source.Feature.VALUE_CLASSES, majorVersion) && previewClassFile) {
784 result.add("value");
785 }
786 return result;
787 }
788
789 private static Set<String> getMethodModifiers(int mask) {
790 return getModifiers(AccessFlags.ofMethod(mask).flags());
791 }
792
793 private static Set<String> getFieldModifiers(int mask) {
794 return getModifiers(AccessFlags.ofField(mask).flags());
795 }
796
797 private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags) {
798 Set<String> s = new LinkedHashSet<>();
799 for (var f : flags)
800 if (f.sourceModifier()) s.add(Modifier.toString(f.mask()));
801 return s;
802 }
803
804 private static Set<String> getClassFlags(int mask) {
805 return getFlags(mask, AccessFlags.ofClass(mask).flags());
806 }
807
808 private static Set<String> getMethodFlags(int mask) {
|