proguard.classfile.util.AccessUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of proguard-core Show documentation
Show all versions of proguard-core Show documentation
ProGuardCORE is a free library to read, analyze, modify, and write Java class files.
/*
* ProGuardCORE -- library to process Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* Licensed 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.
*/
package proguard.classfile.util;
import proguard.classfile.*;
/**
* Utility methods for working with access flags. For convenience, this class
* defines access levels, in ascending order: {@link #PRIVATE},
* {@link #PACKAGE_VISIBLE}, {@link #PROTECTED}, and {@link #PUBLIC}.
*
* @author Eric Lafortune
*/
public class AccessUtil
{
public static final int PRIVATE = 0;
public static final int PACKAGE_VISIBLE = 1;
public static final int PROTECTED = 2;
public static final int PUBLIC = 3;
// The mask of access flags.
private static final int ACCESS_MASK =
AccessConstants.PUBLIC |
AccessConstants.PRIVATE |
AccessConstants.PROTECTED;
/**
* Returns the corresponding access level of the given access flags.
* @param accessFlags the internal access flags as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @return the corresponding access level:
* {@link #PRIVATE},
* {@link #PACKAGE_VISIBLE},
* {@link #PROTECTED}, or
* {@link #PUBLIC}.
*/
public static int accessLevel(int accessFlags)
{
switch (accessFlags & ACCESS_MASK)
{
case AccessConstants.PRIVATE: return PRIVATE;
default: return PACKAGE_VISIBLE;
case AccessConstants.PROTECTED: return PROTECTED;
case AccessConstants.PUBLIC: return PUBLIC;
}
}
/**
* Returns the corresponding access flags of the given access level.
* @param accessLevel the access level:
* {@link #PRIVATE},
* {@link #PACKAGE_VISIBLE},
* {@link #PROTECTED}, or
* {@link #PUBLIC}.
* @return the corresponding internal access flags as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
*/
public static int accessFlags(int accessLevel)
{
switch (accessLevel)
{
case PRIVATE: return AccessConstants.PRIVATE;
default: return 0;
case PROTECTED: return AccessConstants.PROTECTED;
case PUBLIC: return AccessConstants.PUBLIC;
}
}
/**
* Replaces the access part of the given access flags.
* @param accessFlags the internal access flags as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @param newAccessFlags the new access flags as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @return the modified access flags.
*/
public static int replaceAccessFlags(int accessFlags, int newAccessFlags)
{
// A private class member should not be explicitly final.
if (newAccessFlags == AccessConstants.PRIVATE)
{
accessFlags &= ~AccessConstants.FINAL;
}
return (accessFlags & ~ACCESS_MASK) |
(newAccessFlags & ACCESS_MASK);
}
/**
* Returns whether the given access flags match the required set and unset
* access flags.
* @param accessFlags the internal access flags as a logical
* bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @param requiredSetAccessFlags the internal access flags that should be
* set, as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @param requiredUnsetAccessFlags the internal access flags that should be
* unset, as a logical bit mask of
* {@link AccessConstants#PRIVATE},
* {@link AccessConstants#PROTECTED}, and
* {@link AccessConstants#PUBLIC}.
* @return whether the access flags match the requirements.
*/
public static boolean accepted(int accessFlags,
int requiredSetAccessFlags,
int requiredUnsetAccessFlags)
{
int requiredCombinedSetAccessFlags = requiredSetAccessFlags & ~ACCESS_MASK;
int requiredOneSetAccessFlags = requiredSetAccessFlags & ACCESS_MASK;
return (requiredCombinedSetAccessFlags & ~accessFlags) == 0 &&
(requiredUnsetAccessFlags & accessFlags) == 0 &&
(requiredOneSetAccessFlags == 0 || (requiredOneSetAccessFlags & accessFlags) != 0);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy