169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/**
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * An instance of <code>CtMember</code> represents a field, a constructor,
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * or a method.
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic abstract class CtMember {
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    CtMember next;          // for internal use
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected CtClass declaringClass;
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* Make a circular link of CtMembers declared in the
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * same class so that they are garbage-collected together
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the same time.
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static class Cache extends CtMember {
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        protected void extendToString(StringBuffer buffer) {}
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public boolean hasAnnotation(Class clz) { return false; }
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public Object getAnnotation(Class clz)
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            throws ClassNotFoundException { return null; }
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public Object[] getAnnotations()
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            throws ClassNotFoundException { return null; }
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public byte[] getAttribute(String name) { return null; }
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public Object[] getAvailableAnnotations() { return null; }
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public int getModifiers() { return 0; }
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public String getName() { return null; }
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public String getSignature() { return null; }
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public void setAttribute(String name, byte[] data) {}
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        public void setModifiers(int mod) {}
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        private CtMember methodTail;
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        private CtMember consTail;     // constructor tail
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        private CtMember fieldTail;
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        Cache(CtClassType decl) {
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            super(decl);
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            methodTail = this;
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            consTail = this;
5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            fieldTail = this;
5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            fieldTail.next = this;
5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember methodHead() { return this; }
5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember lastMethod() { return methodTail; }
5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember consHead() { return methodTail; }      // may include a static initializer
6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember lastCons() { return consTail; }
6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember fieldHead() { return consTail; }
6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtMember lastField() { return fieldTail; }
6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void addMethod(CtMember method) {
6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            method.next = methodTail.next;
6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            methodTail.next = method;
6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (methodTail == consTail) {
6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                consTail = method;
6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (methodTail == fieldTail)
7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    fieldTail = method;
7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            methodTail = method;
7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        /* Both constructors and a class initializer.
7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal         */
7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void addConstructor(CtMember cons) {
7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            cons.next = consTail.next;
8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            consTail.next = cons;
8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (consTail == fieldTail)
8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                fieldTail = cons;
8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            consTail = cons;
8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void addField(CtMember field) {
8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            field.next = this; // or fieldTail.next
8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            fieldTail.next = field;
9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            fieldTail = field;
9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        static int count(CtMember head, CtMember tail) {
9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int n = 0;
9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            while (head != tail) {
9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                n++;
9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                head = head.next;
9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return n;
10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void remove(CtMember mem) {
10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            CtMember m = this;
10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            CtMember node;
10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            while ((node = m.next) != this) {
10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (node == mem) {
10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    m.next = node.next;
10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    if (node == methodTail)
11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        methodTail = m;
11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    if (node == consTail)
11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        consTail = m;
11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    if (node == fieldTail)
11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        fieldTail = m;
11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    break;
11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                }
12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                else
12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    m = m.next;
12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected CtMember(CtClass clazz) {
12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        declaringClass = clazz;
12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        next = null;
12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    final CtMember next() { return next; }
13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * This method is invoked when setName() or replaceClassName()
13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * in CtClass is called.
13669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
13769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see CtMethod#nameReplaced()
13869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
13969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void nameReplaced() {}
14069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
14169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String toString() {
14269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        StringBuffer buffer = new StringBuffer(getClass().getName());
14369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        buffer.append("@");
14469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        buffer.append(Integer.toHexString(hashCode()));
14569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        buffer.append("[");
14669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        buffer.append(Modifier.toString(getModifiers()));
14769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        extendToString(buffer);
14869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        buffer.append("]");
14969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return buffer.toString();
15069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
15169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
15269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
15369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Invoked by {@link #toString()} to add to the buffer and provide the
15469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * complete value.  Subclasses should invoke this method, adding a
15569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * space before each token.  The modifiers for the member are
15669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * provided first; subclasses should provide additional data such
15769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * as return type, field or method name, etc.
15869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
15969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected abstract void extendToString(StringBuffer buffer);
16069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
16169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
16269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the class that declares this member.
16369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
16469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public CtClass getDeclaringClass() { return declaringClass; }
16569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
16669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
16769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns true if this member is accessible from the given class.
16869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
16969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public boolean visibleFrom(CtClass clazz) {
17069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int mod = getModifiers();
17169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (Modifier.isPublic(mod))
17269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return true;
17369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (Modifier.isPrivate(mod))
17469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return clazz == declaringClass;
17569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {  // package or protected
17669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String declName = declaringClass.getPackageName();
17769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String fromName = clazz.getPackageName();
17869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            boolean visible;
17969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (declName == null)
18069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                visible = fromName == null;
18169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
18269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                visible = declName.equals(fromName);
18369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (!visible && Modifier.isProtected(mod))
18569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return clazz.subclassOf(declaringClass);
18669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return visible;
18869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
18969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
19069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
19169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
19269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Obtains the modifiers of the member.
19369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
19469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          modifiers encoded with
19569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  <code>javassist.Modifier</code>.
19669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see Modifier
19769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
19869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract int getModifiers();
19969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
20069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
20169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Sets the encoded modifiers of the member.
20269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
20369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see Modifier
20469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
20569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract void setModifiers(int mod);
20669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
20769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
20869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns true if the class has the specified annotation class.
20969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
21069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param clz the annotation class.
21169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return <code>true</code> if the annotation is found, otherwise <code>false</code>.
21269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @since 3.11
21369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
21469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract boolean hasAnnotation(Class clz);
21569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
21669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
21769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the annotation if the class has the specified annotation class.
21869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * For example, if an annotation <code>@Author</code> is associated
21969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * with this member, an <code>Author</code> object is returned.
22069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * The member values can be obtained by calling methods on
22169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * the <code>Author</code> object.
22269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
22369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param clz the annotation class.
22469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the annotation if found, otherwise <code>null</code>.
22569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @since 3.11
22669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
22769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract Object getAnnotation(Class clz) throws ClassNotFoundException;
22869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
22969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
23069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the annotations associated with this member.
23169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * For example, if an annotation <code>@Author</code> is associated
23269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * with this member, the returned array contains an <code>Author</code>
23369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * object.  The member values can be obtained by calling methods on
23469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * the <code>Author</code> object.
23569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
23669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return an array of annotation-type objects.
23769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see CtClass#getAnnotations()
23869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
23969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract Object[] getAnnotations() throws ClassNotFoundException;
24069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
24169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
24269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the annotations associated with this member.
24369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * This method is equivalent to <code>getAnnotations()</code>
24469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * except that, if any annotations are not on the classpath,
24569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * they are not included in the returned array.
24669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
24769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return an array of annotation-type objects.
24869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see #getAnnotations()
24969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see CtClass#getAvailableAnnotations()
25069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @since 3.3
25169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
25269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract Object[] getAvailableAnnotations();
25369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
25469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
25569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Obtains the name of the member.
25669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
25769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>As for constructor names, see <code>getName()</code>
25869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * in <code>CtConstructor</code>.
25969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
26069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see CtConstructor#getName()
26169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
26269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract String getName();
26369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
26469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
26569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the character string representing the signature of the member.
26669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * If two members have the same signature (parameter types etc.),
26769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>getSignature()</code> returns the same string.
26869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
26969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract String getSignature();
27069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
27169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
27269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Obtains a user-defined attribute with the given name.
27369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * If that attribute is not found in the class file, this
27469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * method returns null.
27569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
27669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>Note that an attribute is a data block specified by
27769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * the class file format.
27869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * See {@link javassist.bytecode.AttributeInfo}.
27969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
28069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name              attribute name
28169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
28269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract byte[] getAttribute(String name);
28369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
28469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
28569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a user-defined attribute. The attribute is saved in the class file.
28669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
28769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>Note that an attribute is a data block specified by
28869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * the class file format.
28969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * See {@link javassist.bytecode.AttributeInfo}.
29069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
29169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name      attribute name
29269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param data      attribute value
29369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
29469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract void setAttribute(String name, byte[] data);
29569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
296