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