< prev index next >

src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java

Print this page

 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) {
< prev index next >