CtClassType.java revision 69e17611504376e4d4603925f8528dfc890fd2c6
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 Sigalimport java.lang.ref.WeakReference; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.BufferedInputStream; 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.ByteArrayOutputStream; 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.ByteArrayInputStream; 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.DataInputStream; 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.DataOutputStream; 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.IOException; 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.InputStream; 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.net.URL; 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.ArrayList; 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.HashMap; 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.Hashtable; 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.List; 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.Set; 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.AccessFlag; 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.AttributeInfo; 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.AnnotationsAttribute; 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.BadBytecode; 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.Bytecode; 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ClassFile; 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.CodeAttribute; 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ConstantAttribute; 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.CodeIterator; 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ConstPool; 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.Descriptor; 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.EnclosingMethodAttribute; 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.FieldInfo; 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.InnerClassesAttribute; 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.MethodInfo; 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ParameterAnnotationsAttribute; 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.annotation.Annotation; 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.AccessorMaker; 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.CompileError; 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.Javac; 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.expr.ExprEditor; 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/** 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Class types. 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass CtClassType extends CtClass { 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassPool classPool; 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal boolean wasChanged; 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private boolean wasFrozen; 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal boolean wasPruned; 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal boolean gcConstPool; // if true, the constant pool entries will be garbage collected. 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile classfile; 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal byte[] rawClassfile; // backup storage 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private WeakReference memberCache; 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private AccessorMaker accessors; 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private FieldInitLink fieldInitializers; 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private Hashtable hiddenMethods; // must be synchronous 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private int uniqueNumberSeed; 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private boolean doPruning = ClassPool.doPruning; 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private int getCount; 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static final int GET_THRESHOLD = 2; // see compress() 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClassType(String name, ClassPool cp) { 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super(name); 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool = cp; 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasChanged = wasFrozen = wasPruned = gcConstPool = false; 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = null; 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal rawClassfile = null; 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal memberCache = null; 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal accessors = null; 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fieldInitializers = null; 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal hiddenMethods = null; 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal uniqueNumberSeed = 0; 8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getCount = 0; 9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClassType(InputStream ins, ClassPool cp) throws IOException { 9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal this((String)null, cp); 9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = new ClassFile(new DataInputStream(ins)); 9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal qualifiedName = classfile.getName(); 9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected void extendToString(StringBuffer buffer) { 9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasChanged) 10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append("changed "); 10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasFrozen) 10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append("frozen "); 10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasPruned) 10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append("pruned "); 10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(Modifier.toString(getModifiers())); 10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(" class "); 11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(getName()); 11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass ext = getSuperclass(); 11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ext != null) { 11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String name = ext.getName(); 11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!name.equals("java.lang.Object")) 11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(" extends " + ext.getName()); 11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) { 12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(" extends ??"); 12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] intf = getInterfaces(); 12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (intf.length > 0) 12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(" implements "); 12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < intf.length; ++i) { 13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(intf[i].getName()); 13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(", "); 13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) { 13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(" extends ??"); 13669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 13869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 13969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal exToString(buffer, " fields=", 14069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal memCache.fieldHead(), memCache.lastField()); 14169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal exToString(buffer, " constructors=", 14269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal memCache.consHead(), memCache.lastCons()); 14369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal exToString(buffer, " methods=", 14469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal memCache.methodHead(), memCache.lastMethod()); 14569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 14669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 14769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void exToString(StringBuffer buffer, String msg, 14869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember head, CtMember tail) { 14969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(msg); 15069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (head != tail) { 15169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal head = head.next(); 15269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(head); 15369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal buffer.append(", "); 15469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 15569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 15669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 15769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public AccessorMaker getAccessorMaker() { 15869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (accessors == null) 15969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal accessors = new AccessorMaker(this); 16069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 16169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return accessors; 16269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 16369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 16469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ClassFile getClassFile2() { 16569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cfile = classfile; 16669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cfile != null) 16769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cfile; 16869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 16969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.compress(); 17069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (rawClassfile != null) { 17169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 17269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = new ClassFile(new DataInputStream( 17369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal new ByteArrayInputStream(rawClassfile))); 17469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal rawClassfile = null; 17569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getCount = GET_THRESHOLD; 17669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return classfile; 17769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 17869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (IOException e) { 17969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.toString(), e); 18069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 18169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 18269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 18369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InputStream fin = null; 18469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 18569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fin = classPool.openClassfile(getName()); 18669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (fin == null) 18769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(getName()); 18869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 18969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fin = new BufferedInputStream(fin); 19069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = new ClassFile(new DataInputStream(fin)); 19169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!cf.getName().equals(qualifiedName)) 19269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException("cannot find " + qualifiedName + ": " 19369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + cf.getName() + " found in " 19469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + qualifiedName.replace('.', '/') + ".class"); 19569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 19669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = cf; 19769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cf; 19869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 19969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) { 20069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.toString(), e); 20169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 20269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (IOException e) { 20369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.toString(), e); 20469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 20569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal finally { 20669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (fin != null) 20769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 20869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fin.close(); 20969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 21069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (IOException e) {} 21169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 21269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 21369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 21469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* Inherited from CtClass. Called by get() in ClassPool. 21569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 21669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see javassist.CtClass#incGetCounter() 21769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see #toBytecode(DataOutputStream) 21869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 21969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal final void incGetCounter() { ++getCount; } 22069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 22169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 22269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Invoked from ClassPool#compress(). 22369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * It releases the class files that have not been recently used 22469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * if they are unmodified. 22569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 22669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal void compress() { 22769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (getCount < GET_THRESHOLD) 22869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!isModified() && ClassPool.releaseUnmodifiedClassFile) 22969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal removeClassFile(); 23069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else if (isFrozen() && !wasPruned) 23169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal saveClassFile(); 23269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 23369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getCount = 0; 23469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 23569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 23669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 23769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Converts a ClassFile object into a byte array 23869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for saving memory space. 23969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 24069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private synchronized void saveClassFile() { 24169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* getMembers() and releaseClassFile() are also synchronized. 24269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 24369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (classfile == null || hasMemberCache() != null) 24469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 24569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 24669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ByteArrayOutputStream barray = new ByteArrayOutputStream(); 24769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal DataOutputStream out = new DataOutputStream(barray); 24869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 24969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile.write(out); 25069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal barray.close(); 25169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal rawClassfile = barray.toByteArray(); 25269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = null; 25369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 25469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (IOException e) {} 25569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 25669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 25769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private synchronized void removeClassFile() { 25869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (classfile != null && !isModified() && hasMemberCache() == null) 25969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classfile = null; 26069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 26169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 26269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ClassPool getClassPool() { return classPool; } 26369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 26469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal void setClassPool(ClassPool cp) { classPool = cp; } 26569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 26669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public URL getURL() throws NotFoundException { 26769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal URL url = classPool.find(getName()); 26869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (url == null) 26969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(getName()); 27069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 27169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return url; 27269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 27369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 27469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean isModified() { return wasChanged; } 27569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 27669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean isFrozen() { return wasFrozen; } 27769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 27869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void freeze() { wasFrozen = true; } 27969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 28069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal void checkModify() throws RuntimeException { 28169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (isFrozen()) { 28269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String msg = getName() + " class is frozen"; 28369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasPruned) 28469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal msg += " and pruned"; 28569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 28669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(msg); 28769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 28869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 28969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasChanged = true; 29069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 29169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 29269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void defrost() { 29369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkPruned("defrost"); 29469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasFrozen = false; 29569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 29669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 29769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean subtypeOf(CtClass clazz) throws NotFoundException { 29869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i; 29969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String cname = clazz.getName(); 30069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (this == clazz || getName().equals(cname)) 30169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 30269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 30369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile file = getClassFile2(); 30469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String supername = file.getSuperclass(); 30569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (supername != null && supername.equals(cname)) 30669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 30769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 30869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String[] ifs = file.getInterfaces(); 30969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = ifs.length; 31069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (i = 0; i < num; ++i) 31169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ifs[i].equals(cname)) 31269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 31369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 31469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (supername != null && classPool.get(supername).subtypeOf(clazz)) 31569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 31669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 31769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (i = 0; i < num; ++i) 31869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (classPool.get(ifs[i]).subtypeOf(clazz)) 31969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 32069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 32169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 32269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 32369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 32469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setName(String name) throws RuntimeException { 32569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String oldname = getName(); 32669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name.equals(oldname)) 32769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 32869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 32969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // check this in advance although classNameChanged() below does. 33069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.checkNotFrozen(name); 33169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 33269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super.setName(name); 33369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.setName(name); 33469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal nameReplaced(); 33569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.classNameChanged(oldname, this); 33669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 33769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 33869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void replaceClassName(ClassMap classnames) 33969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws RuntimeException 34069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 34169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String oldClassName = getName(); 34269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String newClassName 34369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal = (String)classnames.get(Descriptor.toJvmName(oldClassName)); 34469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (newClassName != null) { 34569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newClassName = Descriptor.toJavaName(newClassName); 34669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // check this in advance although classNameChanged() below does. 34769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.checkNotFrozen(newClassName); 34869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 34969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 35069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super.replaceClassName(classnames); 35169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 35269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.renameClass(classnames); 35369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal nameReplaced(); 35469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 35569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (newClassName != null) { 35669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super.setName(newClassName); 35769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.classNameChanged(oldClassName, this); 35869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 35969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 36069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 36169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void replaceClassName(String oldname, String newname) 36269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws RuntimeException 36369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 36469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String thisname = getName(); 36569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (thisname.equals(oldname)) 36669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal setName(newname); 36769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 36869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super.replaceClassName(oldname, newname); 36969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().renameClass(oldname, newname); 37069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal nameReplaced(); 37169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 37269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 37369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 37469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean isInterface() { 37569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return Modifier.isInterface(getModifiers()); 37669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 37769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 37869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean isAnnotation() { 37969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return Modifier.isAnnotation(getModifiers()); 38069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 38169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 38269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean isEnum() { 38369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return Modifier.isEnum(getModifiers()); 38469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 38569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 38669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int getModifiers() { 38769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 38869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int acc = cf.getAccessFlags(); 38969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal acc = AccessFlag.clear(acc, AccessFlag.SUPER); 39069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int inner = cf.getInnerAccessFlags(); 39169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (inner != -1 && (inner & AccessFlag.STATIC) != 0) 39269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal acc |= AccessFlag.STATIC; 39369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 39469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return AccessFlag.toModifier(acc); 39569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 39669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 39769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtClass[] getNestedClasses() throws NotFoundException { 39869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 39969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InnerClassesAttribute ica 40069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal = (InnerClassesAttribute)cf.getAttribute(InnerClassesAttribute.tag); 40169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ica == null) 40269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return new CtClass[0]; 40369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 40469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String thisName = cf.getName() + "$"; 40569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = ica.tableLength(); 40669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ArrayList list = new ArrayList(n); 40769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; i++) { 40869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String name = ica.innerClass(i); 40969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name != null) 41069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name.startsWith(thisName)) { 41169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // if it is an immediate nested class 41269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name.lastIndexOf('$') < thisName.length()) 41369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list.add(classPool.get(name)); 41469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 41569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 41669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 41769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtClass[])list.toArray(new CtClass[list.size()]); 41869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 41969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 42069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setModifiers(int mod) { 42169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 42269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (Modifier.isStatic(mod)) { 42369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int flags = cf.getInnerAccessFlags(); 42469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (flags != -1 && (flags & AccessFlag.STATIC) != 0) 42569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mod = mod & ~Modifier.STATIC; 42669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 42769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException("cannot change " + getName() + " into a static class"); 42869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 42969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 43069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 43169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.setAccessFlags(AccessFlag.of(mod)); 43269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 43369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 43469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean hasAnnotation(Class clz) { 43569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 43669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo = (AnnotationsAttribute) 43769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.invisibleTag); 43869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo2 = (AnnotationsAttribute) 43969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.visibleTag); 44069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return hasAnnotationType(clz, getClassPool(), ainfo, ainfo2); 44169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 44269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 44369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static boolean hasAnnotationType(Class clz, ClassPool cp, 44469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute a1, AnnotationsAttribute a2) 44569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 44669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Annotation[] anno1, anno2; 44769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 44869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a1 == null) 44969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = null; 45069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 45169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = a1.getAnnotations(); 45269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 45369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a2 == null) 45469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = null; 45569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 45669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = a2.getAnnotations(); 45769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 45869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String typeName = clz.getName(); 45969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno1 != null) 46069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < anno1.length; i++) 46169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno1[i].getTypeName().equals(typeName)) 46269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 46369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 46469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno2 != null) 46569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < anno2.length; i++) 46669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno2[i].getTypeName().equals(typeName)) 46769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 46869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 46969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 47069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 47169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 47269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object getAnnotation(Class clz) throws ClassNotFoundException { 47369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 47469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo = (AnnotationsAttribute) 47569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.invisibleTag); 47669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo2 = (AnnotationsAttribute) 47769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.visibleTag); 47869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return getAnnotationType(clz, getClassPool(), ainfo, ainfo2); 47969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 48069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 48169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Object getAnnotationType(Class clz, ClassPool cp, 48269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute a1, AnnotationsAttribute a2) 48369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException 48469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 48569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Annotation[] anno1, anno2; 48669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 48769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a1 == null) 48869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = null; 48969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 49069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = a1.getAnnotations(); 49169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 49269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a2 == null) 49369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = null; 49469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 49569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = a2.getAnnotations(); 49669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 49769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String typeName = clz.getName(); 49869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno1 != null) 49969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < anno1.length; i++) 50069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno1[i].getTypeName().equals(typeName)) 50169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return toAnnoType(anno1[i], cp); 50269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 50369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno2 != null) 50469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < anno2.length; i++) 50569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anno2[i].getTypeName().equals(typeName)) 50669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return toAnnoType(anno2[i], cp); 50769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 50869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 50969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 51069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 51169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object[] getAnnotations() throws ClassNotFoundException { 51269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return getAnnotations(false); 51369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 51469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 51569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object[] getAvailableAnnotations(){ 51669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 51769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return getAnnotations(true); 51869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 51969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (ClassNotFoundException e) { 52069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException("Unexpected exception ", e); 52169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 52269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 52369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 52469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private Object[] getAnnotations(boolean ignoreNotFound) 52569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException 52669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 52769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 52869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo = (AnnotationsAttribute) 52969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.invisibleTag); 53069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute ainfo2 = (AnnotationsAttribute) 53169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.getAttribute(AnnotationsAttribute.visibleTag); 53269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return toAnnotationType(ignoreNotFound, getClassPool(), ainfo, ainfo2); 53369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 53469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 53569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Object[] toAnnotationType(boolean ignoreNotFound, ClassPool cp, 53669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AnnotationsAttribute a1, AnnotationsAttribute a2) 53769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException 53869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 53969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Annotation[] anno1, anno2; 54069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int size1, size2; 54169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 54269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a1 == null) { 54369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = null; 54469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size1 = 0; 54569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 54669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 54769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = a1.getAnnotations(); 54869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size1 = anno1.length; 54969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 55069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 55169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a2 == null) { 55269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = null; 55369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size2 = 0; 55469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 55569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 55669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = a2.getAnnotations(); 55769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size2 = anno2.length; 55869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 55969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 56069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!ignoreNotFound){ 56169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Object[] result = new Object[size1 + size2]; 56269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < size1; i++) 56369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i] = toAnnoType(anno1[i], cp); 56469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 56569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0; j < size2; j++) 56669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[j + size1] = toAnnoType(anno2[j], cp); 56769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 56869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return result; 56969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 57069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else{ 57169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ArrayList annotations = new ArrayList(); 57269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0 ; i < size1 ; i++){ 57369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try{ 57469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal annotations.add(toAnnoType(anno1[i], cp)); 57569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 57669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch(ClassNotFoundException e){} 57769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 57869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0; j < size2; j++) { 57969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try{ 58069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal annotations.add(toAnnoType(anno2[j], cp)); 58169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 58269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch(ClassNotFoundException e){} 58369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 58469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 58569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return annotations.toArray(); 58669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 58769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 58869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 58969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Object[][] toAnnotationType(boolean ignoreNotFound, ClassPool cp, 59069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ParameterAnnotationsAttribute a1, 59169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ParameterAnnotationsAttribute a2, 59269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo) 59369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException 59469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 59569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int numParameters = 0; 59669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a1 != null) 59769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal numParameters = a1.numParameters(); 59869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else if (a2 != null) 59969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal numParameters = a2.numParameters(); 60069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 60169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal numParameters = Descriptor.numOfParameters(minfo.getDescriptor()); 60269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 60369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Object[][] result = new Object[numParameters][]; 60469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < numParameters; i++) { 60569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Annotation[] anno1, anno2; 60669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int size1, size2; 60769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 60869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a1 == null) { 60969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = null; 61069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size1 = 0; 61169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 61269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 61369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno1 = a1.getAnnotations()[i]; 61469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size1 = anno1.length; 61569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 61669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 61769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (a2 == null) { 61869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = null; 61969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size2 = 0; 62069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 62169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 62269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal anno2 = a2.getAnnotations()[i]; 62369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal size2 = anno2.length; 62469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 62569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 62669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!ignoreNotFound){ 62769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i] = new Object[size1 + size2]; 62869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0; j < size1; ++j) 62969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i][j] = toAnnoType(anno1[j], cp); 63069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 63169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0; j < size2; ++j) 63269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i][j + size1] = toAnnoType(anno2[j], cp); 63369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 63469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else{ 63569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ArrayList annotations = new ArrayList(); 63669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0 ; j < size1 ; j++){ 63769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try{ 63869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal annotations.add(toAnnoType(anno1[j], cp)); 63969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 64069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch(ClassNotFoundException e){} 64169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 64269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int j = 0; j < size2; j++){ 64369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try{ 64469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal annotations.add(toAnnoType(anno2[j], cp)); 64569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 64669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch(ClassNotFoundException e){} 64769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 64869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 64969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i] = annotations.toArray(); 65069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 65169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 65269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 65369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return result; 65469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 65569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 65669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static Object toAnnoType(Annotation anno, ClassPool cp) 65769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws ClassNotFoundException 65869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 65969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 66069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassLoader cl = cp.getClassLoader(); 66169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return anno.toAnnotationType(cl, cp); 66269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 66369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (ClassNotFoundException e) { 66469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassLoader cl2 = cp.getClass().getClassLoader(); 66569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return anno.toAnnotationType(cl2, cp); 66669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 66769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 66869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 66969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean subclassOf(CtClass superclass) { 67069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (superclass == null) 67169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 67269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 67369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String superName = superclass.getName(); 67469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass curr = this; 67569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 67669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (curr != null) { 67769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (curr.getName().equals(superName)) 67869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 67969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 68069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal curr = curr.getSuperclass(); 68169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 68269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 68369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (Exception ignored) {} 68469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 68569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 68669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 68769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtClass getSuperclass() throws NotFoundException { 68869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String supername = getClassFile2().getSuperclass(); 68969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (supername == null) 69069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 69169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 69269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return classPool.get(supername); 69369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 69469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 69569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setSuperclass(CtClass clazz) throws CannotCompileException { 69669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 69769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (isInterface()) 69869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal addInterface(clazz); 69969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 70069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().setSuperclass(clazz.getName()); 70169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 70269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 70369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtClass[] getInterfaces() throws NotFoundException { 70469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String[] ifs = getClassFile2().getInterfaces(); 70569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = ifs.length; 70669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifc = new CtClass[num]; 70769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < num; ++i) 70869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ifc[i] = classPool.get(ifs[i]); 70969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 71069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return ifc; 71169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 71269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 71369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setInterfaces(CtClass[] list) { 71469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 71569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String[] ifs; 71669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (list == null) 71769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ifs = new String[0]; 71869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 71969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = list.length; 72069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ifs = new String[num]; 72169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < num; ++i) 72269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ifs[i] = list[i].getName(); 72369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 72469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 72569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().setInterfaces(ifs); 72669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 72769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 72869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addInterface(CtClass anInterface) { 72969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 73069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (anInterface != null) 73169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().addInterface(anInterface.getName()); 73269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 73369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 73469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtClass getDeclaringClass() throws NotFoundException { 73569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 73669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InnerClassesAttribute ica = (InnerClassesAttribute)cf.getAttribute( 73769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InnerClassesAttribute.tag); 73869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ica == null) 73969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 74069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 74169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String name = getName(); 74269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = ica.tableLength(); 74369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) 74469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (name.equals(ica.innerClass(i))) { 74569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String outName = ica.outerClass(i); 74669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (outName != null) 74769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return classPool.get(outName); 74869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 74969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // maybe anonymous or local class. 75069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal EnclosingMethodAttribute ema 75169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal = (EnclosingMethodAttribute)cf.getAttribute( 75269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal EnclosingMethodAttribute.tag); 75369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ema != null) 75469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return classPool.get(ema.className()); 75569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 75669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 75769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 75869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 75969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 76069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 76169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod getEnclosingMethod() throws NotFoundException { 76269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 76369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal EnclosingMethodAttribute ema 76469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal = (EnclosingMethodAttribute)cf.getAttribute( 76569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal EnclosingMethodAttribute.tag); 76669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ema != null) { 76769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass enc = classPool.get(ema.className()); 76869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return enc.getMethod(ema.methodName(), ema.methodDescriptor()); 76969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 77069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 77169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 77269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 77369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 77469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtClass makeNestedClass(String name, boolean isStatic) { 77569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!isStatic) 77669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException( 77769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal "sorry, only nested static class is supported"); 77869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 77969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 78069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass c = classPool.makeNestedClass(getName() + "$" + name); 78169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 78269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf2 = c.getClassFile2(); 78369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InnerClassesAttribute ica = (InnerClassesAttribute)cf.getAttribute( 78469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal InnerClassesAttribute.tag); 78569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ica == null) { 78669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ica = new InnerClassesAttribute(cf.getConstPool()); 78769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.addAttribute(ica); 78869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 78969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 79069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ica.append(c.getName(), this.getName(), name, 79169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal (cf2.getAccessFlags() & ~AccessFlag.SUPER) | AccessFlag.STATIC); 79269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf2.addAttribute(ica.copy(cf2.getConstPool(), null)); 79369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return c; 79469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 79569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 79669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* flush cached names. 79769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 79869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void nameReplaced() { 79969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache cache = hasMemberCache(); 80069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cache != null) { 80169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = cache.methodHead(); 80269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember tail = cache.lastMethod(); 80369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != tail) { 80469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 80569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth.nameReplaced(); 80669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 80769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 80869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 80969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 81069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 81169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Returns null if members are not cached. 81269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 81369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected CtMember.Cache hasMemberCache() { 81469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (memberCache != null) 81569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtMember.Cache)memberCache.get(); 81669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 81769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 81869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 81969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 82069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected synchronized CtMember.Cache getMembers() { 82169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache cache = null; 82269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (memberCache == null 82369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal || (cache = (CtMember.Cache)memberCache.get()) == null) { 82469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cache = new CtMember.Cache(this); 82569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal makeFieldCache(cache); 82669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal makeBehaviorCache(cache); 82769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal memberCache = new WeakReference(cache); 82869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 82969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 83069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cache; 83169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 83269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 83369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void makeFieldCache(CtMember.Cache cache) { 83469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = getClassFile2().getFields(); 83569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 83669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) { 83769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInfo finfo = (FieldInfo)list.get(i); 83869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField newField = new CtField(finfo, this); 83969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cache.addField(newField); 84069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 84169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 84269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 84369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void makeBehaviorCache(CtMember.Cache cache) { 84469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = getClassFile2().getMethods(); 84569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 84669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) { 84769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo = (MethodInfo)list.get(i); 84869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (minfo.isMethod()) { 84969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMethod newMethod = new CtMethod(minfo, this); 85069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cache.addMethod(newMethod); 85169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 85269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 85369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor newCons = new CtConstructor(minfo, this); 85469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cache.addConstructor(newCons); 85569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 85669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 85769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 85869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 85969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtField[] getFields() { 86069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ArrayList alist = new ArrayList(); 86169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getFields(alist, this); 86269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtField[])alist.toArray(new CtField[alist.size()]); 86369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 86469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 86569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static void getFields(ArrayList alist, CtClass cc) { 86669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i, num; 86769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc == null) 86869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 86969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 87069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 87169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getFields(alist, cc.getSuperclass()); 87269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 87369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 87469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 87569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 87669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifs = cc.getInterfaces(); 87769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal num = ifs.length; 87869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (i = 0; i < num; ++i) 87969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getFields(alist, ifs[i]); 88069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 88169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 88269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 88369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = ((CtClassType)cc).getMembers(); 88469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember field = memCache.fieldHead(); 88569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember tail = memCache.lastField(); 88669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (field != tail) { 88769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal field = field.next(); 88869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!Modifier.isPrivate(field.getModifiers())) 88969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal alist.add(field); 89069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 89169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 89269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 89369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtField getField(String name, String desc) throws NotFoundException { 89469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField f = getField2(name, desc); 89569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return checkGetField(f, name, desc); 89669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 89769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 89869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private CtField checkGetField(CtField f, String name, String desc) 89969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws NotFoundException 90069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 90169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (f == null) { 90269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String msg = "field: " + name; 90369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (desc != null) 90469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal msg += " type " + desc; 90569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 90669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(msg + " in " + getName()); 90769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 90869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 90969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return f; 91069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 91169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 91269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField getField2(String name, String desc) { 91369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField df = getDeclaredField2(name, desc); 91469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (df != null) 91569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return df; 91669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 91769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 91869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifs = getInterfaces(); 91969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = ifs.length; 92069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < num; ++i) { 92169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField f = ifs[i].getField2(name, desc); 92269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (f != null) 92369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return f; 92469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 92569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 92669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass s = getSuperclass(); 92769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (s != null) 92869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return s.getField2(name, desc); 92969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 93069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 93169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 93269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 93369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 93469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtField[] getDeclaredFields() { 93569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 93669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember field = memCache.fieldHead(); 93769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember tail = memCache.lastField(); 93869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = CtMember.Cache.count(field, tail); 93969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField[] cfs = new CtField[num]; 94069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 0; 94169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (field != tail) { 94269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal field = field.next(); 94369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cfs[i++] = (CtField)field; 94469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 94569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 94669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cfs; 94769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 94869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 94969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtField getDeclaredField(String name) throws NotFoundException { 95069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return getDeclaredField(name, null); 95169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 95269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 95369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtField getDeclaredField(String name, String desc) throws NotFoundException { 95469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField f = getDeclaredField2(name, desc); 95569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return checkGetField(f, name, desc); 95669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 95769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 95869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private CtField getDeclaredField2(String name, String desc) { 95969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 96069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember field = memCache.fieldHead(); 96169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember tail = memCache.lastField(); 96269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (field != tail) { 96369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal field = field.next(); 96469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (field.getName().equals(name) 96569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal && (desc == null || desc.equals(field.getSignature()))) 96669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtField)field; 96769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 96869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 96969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 97069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 97169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 97269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtBehavior[] getDeclaredBehaviors() { 97369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 97469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember cons = memCache.consHead(); 97569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember consTail = memCache.lastCons(); 97669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int cnum = CtMember.Cache.count(cons, consTail); 97769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 97869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 97969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int mnum = CtMember.Cache.count(mth, mthTail); 98069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 98169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtBehavior[] cb = new CtBehavior[cnum + mnum]; 98269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 0; 98369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (cons != consTail) { 98469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cons = cons.next(); 98569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cb[i++] = (CtBehavior)cons; 98669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 98769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 98869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 98969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 99069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cb[i++] = (CtBehavior)mth; 99169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 99269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 99369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cb; 99469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 99569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 99669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtConstructor[] getConstructors() { 99769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 99869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember cons = memCache.consHead(); 99969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember consTail = memCache.lastCons(); 100069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 100169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = 0; 100269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mem = cons; 100369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mem != consTail) { 100469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = mem.next(); 100569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (isPubCons((CtConstructor)mem)) 100669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal n++; 100769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 100869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 100969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor[] result = new CtConstructor[n]; 101069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 0; 101169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = cons; 101269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mem != consTail) { 101369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = mem.next(); 101469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor cc = (CtConstructor)mem; 101569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (isPubCons(cc)) 101669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i++] = cc; 101769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 101869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 101969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return result; 102069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 102169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 102269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static boolean isPubCons(CtConstructor cons) { 102369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return !Modifier.isPrivate(cons.getModifiers()) 102469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal && cons.isConstructor(); 102569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 102669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 102769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtConstructor getConstructor(String desc) 102869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws NotFoundException 102969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 103069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 103169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember cons = memCache.consHead(); 103269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember consTail = memCache.lastCons(); 103369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 103469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (cons != consTail) { 103569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cons = cons.next(); 103669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor cc = (CtConstructor)cons; 103769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc.getMethodInfo2().getDescriptor().equals(desc) 103869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal && cc.isConstructor()) 103969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cc; 104069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 104169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 104269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return super.getConstructor(desc); 104369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 104469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 104569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtConstructor[] getDeclaredConstructors() { 104669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 104769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember cons = memCache.consHead(); 104869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember consTail = memCache.lastCons(); 104969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 105069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = 0; 105169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mem = cons; 105269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mem != consTail) { 105369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = mem.next(); 105469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor cc = (CtConstructor)mem; 105569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc.isConstructor()) 105669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal n++; 105769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 105869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 105969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor[] result = new CtConstructor[n]; 106069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 0; 106169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = cons; 106269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mem != consTail) { 106369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mem = mem.next(); 106469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor cc = (CtConstructor)mem; 106569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc.isConstructor()) 106669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal result[i++] = cc; 106769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 106869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 106969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return result; 107069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 107169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 107269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtConstructor getClassInitializer() { 107369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 107469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember cons = memCache.consHead(); 107569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember consTail = memCache.lastCons(); 107669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 107769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (cons != consTail) { 107869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cons = cons.next(); 107969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor cc = (CtConstructor)cons; 108069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc.isClassInitializer()) 108169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cc; 108269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 108369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 108469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 108569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 108669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 108769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod[] getMethods() { 108869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal HashMap h = new HashMap(); 108969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMethods0(h, this); 109069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtMethod[])h.values().toArray(new CtMethod[h.size()]); 109169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 109269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 109369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static void getMethods0(HashMap h, CtClass cc) { 109469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 109569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifs = cc.getInterfaces(); 109669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int size = ifs.length; 109769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < size; ++i) 109869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMethods0(h, ifs[i]); 109969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 110069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 110169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 110269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 110369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass s = cc.getSuperclass(); 110469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (s != null) 110569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMethods0(h, s); 110669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 110769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 110869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 110969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc instanceof CtClassType) { 111069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = ((CtClassType)cc).getMembers(); 111169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 111269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 111369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 111469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 111569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 111669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!Modifier.isPrivate(mth.getModifiers())) 111769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal h.put(((CtMethod)mth).getStringRep(), mth); 111869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 111969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 112069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 112169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 112269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod getMethod(String name, String desc) 112369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws NotFoundException 112469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 112569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMethod m = getMethod0(this, name, desc); 112669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (m != null) 112769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return m; 112869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 112969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(name + "(..) is not found in " 113069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + getName()); 113169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 113269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 113369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static CtMethod getMethod0(CtClass cc, 113469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String name, String desc) { 113569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cc instanceof CtClassType) { 113669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = ((CtClassType)cc).getMembers(); 113769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 113869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 113969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 114069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 114169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 114269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (mth.getName().equals(name) 114369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal && ((CtMethod)mth).getMethodInfo2().getDescriptor().equals(desc)) 114469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtMethod)mth; 114569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 114669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 114769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 114869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 114969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass s = cc.getSuperclass(); 115069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (s != null) { 115169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMethod m = getMethod0(s, name, desc); 115269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (m != null) 115369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return m; 115469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 115569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 115669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 115769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 115869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 115969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifs = cc.getInterfaces(); 116069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int size = ifs.length; 116169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < size; ++i) { 116269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMethod m = getMethod0(ifs[i], name, desc); 116369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (m != null) 116469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return m; 116569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 116669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 116769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 116869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 116969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 117069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 117169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod[] getDeclaredMethods() { 117269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 117369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 117469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 117569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int num = CtMember.Cache.count(mth, mthTail); 117669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMethod[] cms = new CtMethod[num]; 117769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 0; 117869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 117969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 118069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cms[i++] = (CtMethod)mth; 118169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 118269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 118369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return cms; 118469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 118569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 118669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod getDeclaredMethod(String name) throws NotFoundException { 118769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 118869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 118969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 119069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 119169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 119269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (mth.getName().equals(name)) 119369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtMethod)mth; 119469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 119569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 119669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(name + "(..) is not found in " 119769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + getName()); 119869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 119969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 120069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtMethod getDeclaredMethod(String name, CtClass[] params) 120169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws NotFoundException 120269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 120369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String desc = Descriptor.ofParameters(params); 120469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache memCache = getMembers(); 120569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mth = memCache.methodHead(); 120669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember mthTail = memCache.lastMethod(); 120769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 120869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (mth != mthTail) { 120969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal mth = mth.next(); 121069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (mth.getName().equals(name) 121169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal && ((CtMethod)mth).getMethodInfo2().getDescriptor().startsWith(desc)) 121269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (CtMethod)mth; 121369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 121469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 121569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(name + "(..) is not found in " 121669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + getName()); 121769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 121869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 121969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addField(CtField f, String init) 122069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 122169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 122269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal addField(f, CtField.Initializer.byExpr(init)); 122369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 122469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 122569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addField(CtField f, CtField.Initializer init) 122669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 122769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 122869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 122969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (f.getDeclaringClass() != this) 123069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException("cannot add"); 123169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 123269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (init == null) 123369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal init = f.getInit(); 123469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 123569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (init != null) { 123669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal init.check(f.getSignature()); 123769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int mod = f.getModifiers(); 123869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (Modifier.isStatic(mod) && Modifier.isFinal(mod)) 123969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 124069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ConstPool cp = getClassFile2().getConstPool(); 124169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int index = init.getConstantValue(cp, f.getType()); 124269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (index != 0) { 124369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal f.getFieldInfo2().addAttribute(new ConstantAttribute(cp, index)); 124469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal init = null; 124569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 124669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 124769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 124869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 124969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 125069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().addField(f); 125169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().addField(f.getFieldInfo2()); 125269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 125369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (init != null) { 125469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInitLink fil = new FieldInitLink(f, init); 125569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInitLink link = fieldInitializers; 125669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (link == null) 125769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fieldInitializers = fil; 125869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 125969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal while (link.next != null) 126069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal link = link.next; 126169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 126269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal link.next = fil; 126369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 126469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 126569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 126669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 126769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void removeField(CtField f) throws NotFoundException { 126869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 126969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInfo fi = f.getFieldInfo2(); 127069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 127169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cf.getFields().remove(fi)) { 127269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().remove(f); 127369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal gcConstPool = true; 127469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 127569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 127669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(f.toString()); 127769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 127869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 127969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public CtConstructor makeClassInitializer() 128069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 128169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 128269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtConstructor clinit = getClassInitializer(); 128369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (clinit != null) 128469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clinit; 128569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 128669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 128769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 128869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Bytecode code = new Bytecode(cf.getConstPool(), 0, 0); 128969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal modifyClassConstructor(cf, code, 0, 0); 129069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return getClassInitializer(); 129169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 129269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 129369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addConstructor(CtConstructor c) 129469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 129569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 129669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 129769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (c.getDeclaringClass() != this) 129869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException("cannot add"); 129969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 130069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().addConstructor(c); 130169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().addMethod(c.getMethodInfo2()); 130269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 130369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 130469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void removeConstructor(CtConstructor m) throws NotFoundException { 130569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 130669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo mi = m.getMethodInfo2(); 130769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 130869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cf.getMethods().remove(mi)) { 130969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().remove(m); 131069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal gcConstPool = true; 131169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 131269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 131369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(m.toString()); 131469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 131569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 131669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void addMethod(CtMethod m) throws CannotCompileException { 131769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 131869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (m.getDeclaringClass() != this) 131969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException("bad declaring class"); 132069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 132169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int mod = m.getModifiers(); 132269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if ((getModifiers() & Modifier.INTERFACE) != 0) { 132369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal m.setModifiers(mod | Modifier.PUBLIC); 132469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if ((mod & Modifier.ABSTRACT) == 0) 132569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException( 132669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal "an interface method must be abstract: " + m.toString()); 132769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 132869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 132969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().addMethod(m); 133069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().addMethod(m.getMethodInfo2()); 133169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if ((mod & Modifier.ABSTRACT) != 0) 133269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal setModifiers(getModifiers() | Modifier.ABSTRACT); 133369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 133469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 133569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void removeMethod(CtMethod m) throws NotFoundException { 133669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 133769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo mi = m.getMethodInfo2(); 133869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 133969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cf.getMethods().remove(mi)) { 134069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getMembers().remove(m); 134169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal gcConstPool = true; 134269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 134369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 134469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new NotFoundException(m.toString()); 134569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 134669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 134769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public byte[] getAttribute(String name) { 134869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AttributeInfo ai = getClassFile2().getAttribute(name); 134969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ai == null) 135069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 135169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 135269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return ai.get(); 135369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 135469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 135569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void setAttribute(String name, byte[] data) { 135669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 135769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 135869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.addAttribute(new AttributeInfo(cf.getConstPool(), name, data)); 135969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 136069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 136169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void instrument(CodeConverter converter) 136269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 136369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 136469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 136569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 136669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ConstPool cp = cf.getConstPool(); 136769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = cf.getMethods(); 136869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 136969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) { 137069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo = (MethodInfo)list.get(i); 137169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal converter.doit(this, minfo, cp); 137269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 137369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 137469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 137569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void instrument(ExprEditor editor) 137669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 137769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 137869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkModify(); 137969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 138069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = cf.getMethods(); 138169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 138269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) { 138369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo = (MethodInfo)list.get(i); 138469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal editor.doit(this, minfo); 138569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 138669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 138769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 138869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /** 138969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see javassist.CtClass#prune() 139069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see javassist.CtClass#stopPruning(boolean) 139169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 139269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void prune() { 139369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasPruned) 139469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 139569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 139669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasPruned = wasFrozen = true; 139769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getClassFile2().prune(); 139869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 139969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 140069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void rebuildClassFile() { gcConstPool = true; } 140169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 140269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void toBytecode(DataOutputStream out) 140369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException, IOException 140469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 140569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 140669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (isModified()) { 140769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal checkPruned("toBytecode"); 140869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassFile cf = getClassFile2(); 140969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (gcConstPool) { 141069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.compact(); 141169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal gcConstPool = false; 141269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 141369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 141469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal modifyClassConstructor(cf); 141569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal modifyConstructors(cf); 141669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.write(out); 141769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal out.flush(); 141869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fieldInitializers = null; 141969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (doPruning) { 142069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // to save memory 142169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.prune(); 142269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasPruned = true; 142369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 142469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 142569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 142669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool.writeClassfile(getName(), out); 142769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // to save memory 142869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // classfile = null; 142969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 143069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 143169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal getCount = 0; 143269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal wasFrozen = true; 143369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 143469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) { 143569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 143669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 143769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (IOException e) { 143869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 143969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 144069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 144169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 144269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* See also checkModified() 144369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 144469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void checkPruned(String method) { 144569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (wasPruned) 144669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(method + "(): " + getName() 144769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal + " was pruned."); 144869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 144969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 145069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public boolean stopPruning(boolean stop) { 145169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal boolean prev = !doPruning; 145269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal doPruning = !stop; 145369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return prev; 145469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 145569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 145669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void modifyClassConstructor(ClassFile cf) 145769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException, NotFoundException 145869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 145969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (fieldInitializers == null) 146069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 146169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 146269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Bytecode code = new Bytecode(cf.getConstPool(), 0, 0); 146369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Javac jv = new Javac(code, this); 146469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int stacksize = 0; 146569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal boolean doInit = false; 146669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (FieldInitLink fi = fieldInitializers; fi != null; fi = fi.next) { 146769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField f = fi.field; 146869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (Modifier.isStatic(f.getModifiers())) { 146969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal doInit = true; 147069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int s = fi.init.compileIfStatic(f.getType(), f.getName(), 147169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal code, jv); 147269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (stacksize < s) 147369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal stacksize = s; 147469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 147569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 147669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 147769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (doInit) // need an initializer for static fileds. 147869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal modifyClassConstructor(cf, code, stacksize, 0); 147969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 148069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 148169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void modifyClassConstructor(ClassFile cf, Bytecode code, 148269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int stacksize, int localsize) 148369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException 148469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 148569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo m = cf.getStaticInitializer(); 148669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (m == null) { 148769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal code.add(Bytecode.RETURN); 148869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal code.setMaxStack(stacksize); 148969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal code.setMaxLocals(localsize); 149069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal m = new MethodInfo(cf.getConstPool(), "<clinit>", "()V"); 149169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal m.setAccessFlags(AccessFlag.STATIC); 149269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal m.setCodeAttribute(code.toCodeAttribute()); 149369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cf.addMethod(m); 149469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtMember.Cache cache = hasMemberCache(); 149569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (cache != null) 149669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal cache.addConstructor(new CtConstructor(m, this)); 149769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 149869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 149969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CodeAttribute codeAttr = m.getCodeAttribute(); 150069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (codeAttr == null) 150169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException("empty <clinit>"); 150269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 150369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 150469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CodeIterator it = codeAttr.iterator(); 150569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int pos = it.insertEx(code.get()); 150669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal it.insert(code.getExceptionTable(), pos); 150769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int maxstack = codeAttr.getMaxStack(); 150869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (maxstack < stacksize) 150969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal codeAttr.setMaxStack(stacksize); 151069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 151169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int maxlocals = codeAttr.getMaxLocals(); 151269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (maxlocals < localsize) 151369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal codeAttr.setMaxLocals(localsize); 151469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 151569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (BadBytecode e) { 151669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 151769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 151869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 151969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 152069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 152169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal m.rebuildStackMapIf6(classPool, cf); 152269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 152369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (BadBytecode e) { 152469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 152569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 152669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 152769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 152869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void modifyConstructors(ClassFile cf) 152969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException, NotFoundException 153069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 153169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (fieldInitializers == null) 153269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; 153369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 153469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ConstPool cp = cf.getConstPool(); 153569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = cf.getMethods(); 153669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 153769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; ++i) { 153869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo = (MethodInfo)list.get(i); 153969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (minfo.isConstructor()) { 154069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CodeAttribute codeAttr = minfo.getCodeAttribute(); 154169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (codeAttr != null) 154269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 154369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Bytecode init = new Bytecode(cp, 0, 154469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal codeAttr.getMaxLocals()); 154569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] params 154669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal = Descriptor.getParameterTypes( 154769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal minfo.getDescriptor(), 154869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal classPool); 154969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int stacksize = makeFieldInitializer(init, params); 155069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal insertAuxInitializer(codeAttr, init, stacksize); 155169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal minfo.rebuildStackMapIf6(classPool, cf); 155269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 155369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (BadBytecode e) { 155469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 155569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 155669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 155769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 155869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 155969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 156069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static void insertAuxInitializer(CodeAttribute codeAttr, 156169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Bytecode initializer, 156269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int stacksize) 156369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws BadBytecode 156469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 156569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CodeIterator it = codeAttr.iterator(); 156669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int index = it.skipSuperConstructor(); 156769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (index < 0) { 156869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal index = it.skipThisConstructor(); 156969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (index >= 0) 157069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return; // this() is called. 157169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 157269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // Neither this() or super() is called. 157369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 157469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 157569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int pos = it.insertEx(initializer.get()); 157669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal it.insert(initializer.getExceptionTable(), pos); 157769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int maxstack = codeAttr.getMaxStack(); 157869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (maxstack < stacksize) 157969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal codeAttr.setMaxStack(stacksize); 158069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 158169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 158269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private int makeFieldInitializer(Bytecode code, CtClass[] parameters) 158369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws CannotCompileException, NotFoundException 158469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 158569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int stacksize = 0; 158669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Javac jv = new Javac(code, this); 158769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 158869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal jv.recordParams(parameters, false); 158969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 159069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (CompileError e) { 159169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new CannotCompileException(e); 159269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 159369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 159469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (FieldInitLink fi = fieldInitializers; fi != null; fi = fi.next) { 159569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField f = fi.field; 159669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (!Modifier.isStatic(f.getModifiers())) { 159769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int s = fi.init.compile(f.getType(), f.getName(), code, 159869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal parameters, jv); 159969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (stacksize < s) 160069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal stacksize = s; 160169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 160269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 160369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 160469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return stacksize; 160569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 160669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 160769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // Methods used by CtNewWrappedMethod 160869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 160969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Hashtable getHiddenMethods() { 161069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (hiddenMethods == null) 161169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal hiddenMethods = new Hashtable(); 161269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 161369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return hiddenMethods; 161469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 161569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 161669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int getUniqueNumber() { return uniqueNumberSeed++; } 161769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 161869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public String makeUniqueName(String prefix) { 161969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal HashMap table = new HashMap(); 162069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal makeMemberList(table); 162169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Set keys = table.keySet(); 162269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String[] methods = new String[keys.size()]; 162369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal keys.toArray(methods); 162469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 162569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (notFindInArray(prefix, methods)) 162669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return prefix; 162769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 162869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int i = 100; 162969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal String name; 163069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal do { 163169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (i > 999) 163269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException("too many unique name"); 163369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 163469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal name = prefix + i++; 163569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } while (!notFindInArray(name, methods)); 163669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return name; 163769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 163869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 163969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static boolean notFindInArray(String prefix, String[] values) { 164069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int len = values.length; 164169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < len; i++) 164269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (values[i].startsWith(prefix)) 164369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return false; 164469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 164569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return true; 164669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 164769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 164869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private void makeMemberList(HashMap table) { 164969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int mod = getModifiers(); 165069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (Modifier.isAbstract(mod) || Modifier.isInterface(mod)) 165169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 165269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass[] ifs = getInterfaces(); 165369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int size = ifs.length; 165469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < size; i++) { 165569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass ic =ifs[i]; 165669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (ic != null && ic instanceof CtClassType) 165769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ((CtClassType)ic).makeMemberList(table); 165869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 165969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 166069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 166169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 166269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 166369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtClass s = getSuperclass(); 166469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (s != null && s instanceof CtClassType) 166569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ((CtClassType)s).makeMemberList(table); 166669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 166769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (NotFoundException e) {} 166869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 166969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal List list = getClassFile2().getMethods(); 167069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int n = list.size(); 167169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; i++) { 167269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal MethodInfo minfo = (MethodInfo)list.get(i); 167369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal table.put(minfo.getName(), this); 167469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 167569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 167669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal list = getClassFile2().getFields(); 167769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal n = list.size(); 167869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal for (int i = 0; i < n; i++) { 167969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInfo finfo = (FieldInfo)list.get(i); 168069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal table.put(finfo.getName(), this); 168169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 168269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 168369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 168469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 168569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass FieldInitLink { 168669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInitLink next; 168769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField field; 168869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal CtField.Initializer init; 168969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 169069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal FieldInitLink(CtField f, CtField.Initializer i) { 169169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal next = null; 169269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal field = f; 169369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal init = i; 169469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 169569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 1696