001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 */
017package org.apache.bcel.classfile;
018
019import org.apache.bcel.Const;
020
021/**
022 * Super class for all objects that have modifiers like private, final, ... I.e. classes, fields, and methods.
023 */
024public abstract class AccessFlags {
025
026    /**
027     * Access flags.
028     *
029     * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter.
030     */
031    @java.lang.Deprecated
032    protected int access_flags; // TODO not used externally at present
033
034    /**
035     * Constructs a new instance.
036     */
037    public AccessFlags() {
038    }
039
040    /**
041     * Constructs a new instance.
042     *
043     * @param accessFlags initial access flags.
044     */
045    public AccessFlags(final int accessFlags) {
046        access_flags = accessFlags;
047    }
048
049    /**
050     * Gets access flags.
051     *
052     * @return Access flags of the object aka. "modifiers".
053     */
054    public final int getAccessFlags() {
055        return access_flags;
056    }
057
058    /**
059     * Gets access flags.
060     *
061     * @return Access flags of the object also known as modifiers.
062     */
063    public final int getModifiers() {
064        return access_flags;
065    }
066
067    /**
068     * Tests whether the abstract bit is on.
069     *
070     * @return whether the abstract bit is on.
071     */
072    public final boolean isAbstract() {
073        return test(Const.ACC_ABSTRACT);
074    }
075
076    /**
077     * Sets the abstract bit.
078     *
079     * @param flag The new value.
080     */
081    public final void isAbstract(final boolean flag) {
082        setFlag(Const.ACC_ABSTRACT, flag);
083    }
084
085    /**
086     * Tests whether the annotation bit is on.
087     *
088     * @return whether the annotation bit is on.
089     */
090    public final boolean isAnnotation() {
091        return test(Const.ACC_ANNOTATION);
092    }
093
094    /**
095     * Sets the annotation bit.
096     *
097     * @param flag The new value.
098     */
099    public final void isAnnotation(final boolean flag) {
100        setFlag(Const.ACC_ANNOTATION, flag);
101    }
102    /**
103     * Tests whether the enum bit is on.
104     *
105     * @return whether the enum bit is on.
106     */
107    public final boolean isEnum() {
108        return test(Const.ACC_ENUM);
109    }
110
111    /**
112     * Sets the enum bit.
113     *
114     * @param flag The new value.
115     */
116    public final void isEnum(final boolean flag) {
117        setFlag(Const.ACC_ENUM, flag);
118    }
119
120    /**
121     * Tests whether the final bit is on.
122     *
123     * @return whether the final bit is on.
124     */
125    public final boolean isFinal() {
126        return test(Const.ACC_FINAL);
127    }
128
129    /**
130     * Sets the final bit.
131     *
132     * @param flag The new value.
133     */
134    public final void isFinal(final boolean flag) {
135        setFlag(Const.ACC_FINAL, flag);
136    }
137
138    /**
139     * Tests whether the interface bit is on.
140     *
141     * @return whether the interface bit is on.
142     */
143    public final boolean isInterface() {
144        return test(Const.ACC_INTERFACE);
145    }
146
147    /**
148     * Sets the interface bit.
149     *
150     * @param flag The new value.
151     */
152    public final void isInterface(final boolean flag) {
153        setFlag(Const.ACC_INTERFACE, flag);
154    }
155
156    /**
157     * Tests whether the native bit is on.
158     *
159     * @return whether the native bit is on.
160     */
161    public final boolean isNative() {
162        return test(Const.ACC_NATIVE);
163    }
164
165    /**
166     * Sets the native bit.
167     *
168     * @param flag The new value.
169     */
170    public final void isNative(final boolean flag) {
171        setFlag(Const.ACC_NATIVE, flag);
172    }
173
174    /**
175     * Tests whether the private bit is on.
176     *
177     * @return whether the private bit is on.
178     */
179    public final boolean isPrivate() {
180        return test(Const.ACC_PRIVATE);
181    }
182
183    /**
184     * Sets the private bit.
185     *
186     * @param flag The new value.
187     */
188    public final void isPrivate(final boolean flag) {
189        setFlag(Const.ACC_PRIVATE, flag);
190    }
191
192    /**
193     * Tests whether the protected bit is on.
194     *
195     * @return whether the protected bit is on.
196     */
197    public final boolean isProtected() {
198        return test(Const.ACC_PROTECTED);
199    }
200
201    /**
202     * Sets the protected bit.
203     *
204     * @param flag The new value.
205     */
206    public final void isProtected(final boolean flag) {
207        setFlag(Const.ACC_PROTECTED, flag);
208    }
209
210    /**
211     * Tests whether the public bit is on.
212     *
213     * @return whether the public bit is on.
214     */
215    public final boolean isPublic() {
216        return test(Const.ACC_PUBLIC);
217    }
218
219    /**
220     * Sets the public bit.
221     *
222     * @param flag The new value.
223     */
224    public final void isPublic(final boolean flag) {
225        setFlag(Const.ACC_PUBLIC, flag);
226    }
227
228    /**
229     * Tests whether the static bit is on.
230     *
231     * @return whether the static bit is on.
232     */
233    public final boolean isStatic() {
234        return test(Const.ACC_STATIC);
235    }
236
237    /**
238     * Sets the static bit.
239     *
240     * @param flag The new value.
241     */
242    public final void isStatic(final boolean flag) {
243        setFlag(Const.ACC_STATIC, flag);
244    }
245
246    /**
247     * Tests whether the strict bit is on.
248     *
249     * @return whether the strict bit is on.
250     */
251    public final boolean isStrictfp() {
252        return test(Const.ACC_STRICT);
253    }
254
255    /**
256     * Sets the strict bit.
257     *
258     * @param flag The new value.
259     */
260    public final void isStrictfp(final boolean flag) {
261        setFlag(Const.ACC_STRICT, flag);
262    }
263
264    /**
265     * Tests whether the synchronized bit is on.
266     *
267     * @return whether the synchronized bit is on.
268     */
269    public final boolean isSynchronized() {
270        return test(Const.ACC_SYNCHRONIZED);
271    }
272
273    /**
274     * Sets the synchronized bit.
275     *
276     * @param flag The new value.
277     */
278    public final void isSynchronized(final boolean flag) {
279        setFlag(Const.ACC_SYNCHRONIZED, flag);
280    }
281
282    /**
283     * Tests whether the synthetic bit is on.
284     *
285     * @return whether the synthetic bit is on.
286     */
287    public final boolean isSynthetic() {
288        return test(Const.ACC_SYNTHETIC);
289    }
290
291    /**
292     * Sets the synthetic bit.
293     *
294     * @param flag The new value.
295     */
296    public final void isSynthetic(final boolean flag) {
297        setFlag(Const.ACC_SYNTHETIC, flag);
298    }
299
300    /**
301     * Tests whether the transient bit is on.
302     *
303     * @return whether the varargs bit is on.
304     */
305    public final boolean isTransient() {
306        return test(Const.ACC_TRANSIENT);
307    }
308
309    /**
310     * Sets the varargs bit.
311     *
312     * @param flag The new value.
313     */
314    public final void isTransient(final boolean flag) {
315        setFlag(Const.ACC_TRANSIENT, flag);
316    }
317
318    /**
319     * Tests whether the varargs bit is on.
320     *
321     * @return whether the varargs bit is on.
322     */
323    public final boolean isVarArgs() {
324        return test(Const.ACC_VARARGS);
325    }
326
327    /**
328     * Sets the varargs bit.
329     *
330     * @param flag The new value.
331     */
332    public final void isVarArgs(final boolean flag) {
333        setFlag(Const.ACC_VARARGS, flag);
334    }
335
336    /**
337     * Tests whether the volatile bit is on.
338     *
339     * @return whether the volatile bit is on.
340     */
341    public final boolean isVolatile() {
342        return test(Const.ACC_VOLATILE);
343    }
344
345    /**
346     * Sets the volatile bit.
347     *
348     * @param flag The new value.
349     */
350    public final void isVolatile(final boolean flag) {
351        setFlag(Const.ACC_VOLATILE, flag);
352    }
353
354    /**
355     * Sets access flags also known as modifiers.
356     *
357     * @param accessFlags Access flags of the object.
358     */
359    public final void setAccessFlags(final int accessFlags) {
360        this.access_flags = accessFlags;
361    }
362
363    private void setFlag(final int flag, final boolean set) {
364        if ((access_flags & flag) != 0) { // Flag is set already
365            if (!set) {
366                access_flags ^= flag;
367            }
368        } else if (set) {
369            access_flags |= flag;
370        }
371    }
372
373    /**
374     * Sets access flags aka "modifiers".
375     *
376     * @param accessFlags Access flags of the object.
377     */
378    public final void setModifiers(final int accessFlags) {
379        setAccessFlags(accessFlags);
380    }
381
382    /**
383     * Tests whether the bit is on.
384     *
385     * @param test the bit to test.
386     * @return whether the bit is on.
387     */
388    private boolean test(final short test) {
389        return (access_flags & test) != 0;
390    }
391}