blob: e9532a2e4ac2469807c8db366b81b0b2b494e531 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Contributor(s): Thomas Ball
*/
package org.netbeans.modules.classfile;
/**
* A utility class defining access flags and access utility methods.
* Access flags are as defined by the Java Virtual Machine Specification
* Second Edition, tables 4.1, 4.4, 4.5 and 4.7.
*
* @author Thomas Ball
*/
public class Access {
/** Declared public, may be accessed from outside its package. */
public static final int PUBLIC = 0x0001;
/** Declared private, usable only within the defining class. */
public static final int PRIVATE = 0x0002;
/** Declared protected, may be accessed within subclasses. */
public static final int PROTECTED = 0x0004;
/** Declared static. */
public static final int STATIC = 0x0008;
/**
* Declared final. For classes this means no subclassing allowed.
* For fields it means no further assignment allowed after initialization.
* For methods it means that the method cannot be overridden.
*/
public static final int FINAL = 0x0010;
/** Declared synchronized; invocation is wrapped in a monitor lock. */
public static final int SYNCHRONIZED = 0x0020;
/**
* Treat superclass methods specially when invoked by the
* <i>invokespecial</i> instruction. This access only applies to
* classes, and shares the same value as SYNCHRONIZED.
*/
public static final int SUPER = 0x0020;
/** Open module in the Module attribute.
* @since 1.52
*/
public static final int OPEN = 0x0020;
/** Transitive requires in the Module attribute.
* @since 1.52
*/
public static final int TRANSITIVE = 0x0020;
/** Declared volatile; cannot be cached. */
public static final int VOLATILE = 0x0040;
/** A bridge method, generated by the compiler. */
public static final int BRIDGE = 0x0040;
/** Static requires in the Module attribute.
* @since 1.52
*/
public static final int STATIC_PHASE = 0x0040;
/**
* Declared transient; not written or read by a persistent object
* manager
*/
public static final int TRANSIENT = 0x0080;
/** Declared with a variable number of arguments. */
public static final int VARARGS = 0x0080;
/** Declared native; implemented in a language other than Java. */
public static final int NATIVE = 0x0100;
/** Is an interface, not a class. */
public static final int INTERFACE = 0x0200;
/** Declared abstract; must not be instantiated. */
public static final int ABSTRACT = 0x0400;
/** Declared strictfp; floating point mode is FP-strict. */
public static final int STRICT = 0x0800;
/** Declared synthetic, not present in the source file. */
public static final int SYNTHETIC = 0x1000;
/** Declared as an annotation type. */
public static final int ANNOTATION = 0x2000;
/**
* For classes, declared as an enum type. For fields, declared as
* an element of an enum.
*/
public static final int ENUM = 0x4000;
/**
* Mandated method parameter.
* @since 1.51
*/
public static final int MANDATED = 0x8000; // method parameter
/**
* For classes, declared as an module.
* @since 1.51
*/
public static final int MODULE = 0x8000; // class
/**
* Return a text representation for a given set of access flags.
* Here are some examples:
* <DL>
* <DD><CODE>"public static final"</CODE>,</DD>
* <DD><CODE>"package private"</CODE>, or</DD>
* <DD><CODE>"protected transient"</CODE>.</DD>
* </DL>
* Note: only access flags that map to Java modifier keywords are returned.
* @param access the mask of flags denoting access permission.
* @return a text representation of the access flags.
*/
public static String toString(int access) {
StringBuffer sb = new StringBuffer();
if ((access & PUBLIC) == PUBLIC)
sb.append("public "); //NOI18N
if ((access & PRIVATE) == PRIVATE)
sb.append("private "); //NOI18N
if ((access & PROTECTED) == PROTECTED)
sb.append("protected "); //NOI18N
if ((access & (PUBLIC | PRIVATE | PROTECTED)) == 0)
sb.append("package private "); //NOI18N
if ((access & STATIC) == STATIC)
sb.append("static "); //NOI18N
if ((access & FINAL) == FINAL)
sb.append("final "); //NOI18N
if ((access & SYNCHRONIZED) == SYNCHRONIZED)
sb.append("synchronized "); //NOI18N
if ((access & VOLATILE) == VOLATILE)
sb.append("volatile "); //NOI18N
if ((access & TRANSIENT) == TRANSIENT)
sb.append("transient "); //NOI18N
if ((access & NATIVE) == NATIVE)
sb.append("native "); //NOI18N
if ((access & ABSTRACT) == ABSTRACT)
sb.append("abstract "); //NOI18N
if ((access & STRICT) == STRICT)
sb.append("strict "); //NOI18N
// trim trailing space
return sb.substring(0, sb.length()-1);
}
public static boolean isStatic(int access) {
return ((access & STATIC) == STATIC);
}
public static final boolean isPublic(int access) {
return ((access & PUBLIC) == PUBLIC);
}
public static final boolean isProtected(int access) {
return ((access & PROTECTED) == PROTECTED);
}
public static final boolean isPackagePrivate(int access) {
return ((access & (PUBLIC | PRIVATE | PROTECTED)) == 0);
}
public static final boolean isPrivate(int access) {
return ((access & PRIVATE) == PRIVATE);
}
private Access() {
// don't allow instantiation
}
}