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

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