I've noticed strange CtConstructor's constructor behavior. The following code illustrates the problem:
import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; public class Test { Test( Test t ){} public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass baseCtClass = pool.getCtClass( Test.class.getName() ); CtClass childCtClass = pool.makeClass( Test.class.getName() + "$$Ex", baseCtClass ); assert baseCtClass.getDeclaredConstructors().length == 1; assert baseCtClass.getDeclaredConstructors()[0].getParameterTypes().length == 1; assert baseCtClass.getDeclaredConstructors()[0].getParameterTypes()[0].equals( baseCtClass ); assert childCtClass.getDeclaredConstructors().length == 0; CtConstructor childCtor = new CtConstructor( baseCtClass.getDeclaredConstructors()[0], childCtClass, null ); childCtor.setBody( "{ super($$); }" ); childCtClass.addConstructor( childCtor ); assert childCtClass.getDeclaredConstructors().length == 1; assert childCtClass.getDeclaredConstructors()[0].getParameterTypes().length == 1; assert childCtClass.getDeclaredConstructors()[0].getParameterTypes()[0].equals( baseCtClass ); //the last assert fails (at least using Sun's jdk 1.6 u 10 / javassist 3.9.0 ) //for some reason ctor parameter type is Test$$Ex instead of Test } }