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 {
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 {
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) {
|