ctClass.instrument(
new ExprEditor() {
public void edit(NewExpr newExpr) throws CannotCompileException {
try {
CtBehavior where = null;
try {
where = newExpr.where();
}
catch (RuntimeException e) {
// <clinit> access leads to a bug in Javassist
where = ctClass.getClassInitializer();
}
// filter caller methods
if (methodFilterCaller(where)) {
return;
}
CtConstructor ctConstructor = newExpr.getConstructor();
String calleeClassName = newExpr.getClassName();
// filter callee classes
if (!definition.inIncludePackage(calleeClassName)) {
return;
}
// filter the constructors
if (constructorFilter(ctConstructor)) {
return;
}
// create the class meta-data
ClassMetaData calleeSideClassMetaData;
try {
calleeSideClassMetaData =
JavassistMetaDataMaker.createClassMetaData(
context.getClassPool().get(calleeClassName)
);
}
catch (NotFoundException e) {
throw new WrappedRuntimeException(e);
}
// create the method meta-data
ConstructorMetaData constructorMetaData =
JavassistMetaDataMaker.createConstructorMetaData(newExpr.getConstructor());
// is this a caller side method pointcut?
if (definition.isPickedOutByCallPointcut(calleeSideClassMetaData, constructorMetaData)) {
// check the callee class is not the same as target class, if that is the case
// then we have have class loaded and set in the ___AW_clazz already
String declaringClassMethodName = TransformationUtil.STATIC_CLASS_FIELD;
CtClass declaringClass = ctConstructor.getDeclaringClass();
if (!declaringClass.getName().replace('/', '.').equals(where.getDeclaringClass().getName().replace('/', '.'))) {
declaringClassMethodName =
addCalleeMethodDeclaringClassField(ctClass, ctConstructor);
}
// call the wrapper method instead of the callee method
StringBuffer body = new StringBuffer();
body.append('{');
if (ctConstructor.getParameterTypes().length > 0) {
body.append("Object[] args = $args; ");
}
else {
body.append("Object[] args = null; ");
}
body.append("Class declaringClassMethodName = ");
body.append(declaringClassMethodName);
body.append("; ");
if (Modifier.isStatic(where.getModifiers())) {
body.append("Object nullObject = null;");
}
body.append("$_ = ($r)");
body.append(TransformationUtil.JOIN_POINT_MANAGER_FIELD);
body.append('.');
body.append(TransformationUtil.PROCEED_WITH_CALL_JOIN_POINT_METHOD);
body.append('(');
body.append(TransformationUtil.calculateHash(ctConstructor));
body.append(',');
body.append(m_joinPointIndex);
body.append(", args, ");
if (Modifier.isStatic(where.getModifiers())) {
body.append("nullObject");
}
else {
body.append("this");
}