Path: blob/master/src/jdk.jdeps/share/classes/com/sun/tools/classfile/AccessFlags.java
41161 views
/*1* Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package com.sun.tools.classfile;2627import java.io.IOException;28import java.util.LinkedHashSet;29import java.util.Set;3031/**32* See JVMS, sections 4.2, 4.6, 4.7.33*34* <p><b>This is NOT part of any supported API.35* If you write code that depends on this, you do so at your own risk.36* This code and its internal interfaces are subject to change or37* deletion without notice.</b>38*/39public class AccessFlags {40public static final int ACC_PUBLIC = 0x0001; // class, inner, field, method41public static final int ACC_PRIVATE = 0x0002; // inner, field, method42public static final int ACC_PROTECTED = 0x0004; // inner, field, method43public static final int ACC_STATIC = 0x0008; // inner, field, method44public static final int ACC_FINAL = 0x0010; // class, inner, field, method45public static final int ACC_SUPER = 0x0020; // class46public static final int ACC_SYNCHRONIZED = 0x0020; // method47public static final int ACC_VOLATILE = 0x0040; // field48public static final int ACC_BRIDGE = 0x0040; // method49public static final int ACC_TRANSIENT = 0x0080; // field50public static final int ACC_VARARGS = 0x0080; // method51public static final int ACC_NATIVE = 0x0100; // method52public static final int ACC_INTERFACE = 0x0200; // class, inner53public static final int ACC_ABSTRACT = 0x0400; // class, inner, method54public static final int ACC_STRICT = 0x0800; // method55public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method56public static final int ACC_ANNOTATION = 0x2000; // class, inner57public static final int ACC_ENUM = 0x4000; // class, inner, field58public static final int ACC_MANDATED = 0x8000; // method parameter59public static final int ACC_MODULE = 0x8000; // class6061public static enum Kind { Class, InnerClass, Field, Method}6263AccessFlags(ClassReader cr) throws IOException {64this(cr.readUnsignedShort());65}6667public AccessFlags(int flags) {68this.flags = flags;69}7071public AccessFlags ignore(int mask) {72return new AccessFlags(flags & ~mask);73}7475public boolean is(int mask) {76return (flags & mask) != 0;77}7879public int byteLength() {80return 2;81}8283private static final int[] classModifiers = {84ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT85};8687private static final int[] classFlags = {88ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, ACC_ABSTRACT,89ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE90};9192public Set<String> getClassModifiers() {93int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags);94return getModifiers(f, classModifiers, Kind.Class);95}9697public Set<String> getClassFlags() {98return getFlags(classFlags, Kind.Class);99}100101private static final int[] innerClassModifiers = {102ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,103ACC_ABSTRACT104};105106private static final int[] innerClassFlags = {107ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SUPER,108ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM109};110111public Set<String> getInnerClassModifiers() {112int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags);113return getModifiers(f, innerClassModifiers, Kind.InnerClass);114}115116public Set<String> getInnerClassFlags() {117return getFlags(innerClassFlags, Kind.InnerClass);118}119120private static final int[] fieldModifiers = {121ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,122ACC_VOLATILE, ACC_TRANSIENT123};124125private static final int[] fieldFlags = {126ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,127ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM128};129130public Set<String> getFieldModifiers() {131return getModifiers(fieldModifiers, Kind.Field);132}133134public Set<String> getFieldFlags() {135return getFlags(fieldFlags, Kind.Field);136}137138private static final int[] methodModifiers = {139ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,140ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT141};142143private static final int[] methodFlags = {144ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,145ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT,146ACC_STRICT, ACC_SYNTHETIC147};148149public Set<String> getMethodModifiers() {150return getModifiers(methodModifiers, Kind.Method);151}152153public Set<String> getMethodFlags() {154return getFlags(methodFlags, Kind.Method);155}156157private Set<String> getModifiers(int[] modifierFlags, Kind t) {158return getModifiers(flags, modifierFlags, t);159}160161private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) {162Set<String> s = new LinkedHashSet<>();163for (int m: modifierFlags) {164if ((flags & m) != 0)165s.add(flagToModifier(m, t));166}167return s;168}169170private Set<String> getFlags(int[] expectedFlags, Kind t) {171Set<String> s = new LinkedHashSet<>();172int f = flags;173for (int e: expectedFlags) {174if ((f & e) != 0) {175s.add(flagToName(e, t));176f = f & ~e;177}178}179while (f != 0) {180int bit = Integer.highestOneBit(f);181s.add("0x" + Integer.toHexString(bit));182f = f & ~bit;183}184return s;185}186187private static String flagToModifier(int flag, Kind t) {188switch (flag) {189case ACC_PUBLIC:190return "public";191case ACC_PRIVATE:192return "private";193case ACC_PROTECTED:194return "protected";195case ACC_STATIC:196return "static";197case ACC_FINAL:198return "final";199case ACC_SYNCHRONIZED:200return "synchronized";201case 0x80:202return (t == Kind.Field ? "transient" : null);203case ACC_VOLATILE:204return "volatile";205case ACC_NATIVE:206return "native";207case ACC_ABSTRACT:208return "abstract";209case ACC_STRICT:210return "strictfp";211case ACC_MANDATED:212return "mandated";213default:214return null;215}216}217218private static String flagToName(int flag, Kind t) {219switch (flag) {220case ACC_PUBLIC:221return "ACC_PUBLIC";222case ACC_PRIVATE:223return "ACC_PRIVATE";224case ACC_PROTECTED:225return "ACC_PROTECTED";226case ACC_STATIC:227return "ACC_STATIC";228case ACC_FINAL:229return "ACC_FINAL";230case 0x20:231return (t == Kind.Class ? "ACC_SUPER" : "ACC_SYNCHRONIZED");232case 0x40:233return (t == Kind.Field ? "ACC_VOLATILE" : "ACC_BRIDGE");234case 0x80:235return (t == Kind.Field ? "ACC_TRANSIENT" : "ACC_VARARGS");236case ACC_NATIVE:237return "ACC_NATIVE";238case ACC_INTERFACE:239return "ACC_INTERFACE";240case ACC_ABSTRACT:241return "ACC_ABSTRACT";242case ACC_STRICT:243return "ACC_STRICT";244case ACC_SYNTHETIC:245return "ACC_SYNTHETIC";246case ACC_ANNOTATION:247return "ACC_ANNOTATION";248case ACC_ENUM:249return "ACC_ENUM";250case 0x8000:251return (t == Kind.Class ? "ACC_MODULE" : "ACC_MANDATED");252default:253return null;254}255}256257public final int flags;258}259260261