[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Constructor ITD question: introduce no-arg ctor instead of letting JDO/JPA enhancer do it?

I'm having some trouble getting around a problem I'm having with field
initialization and a persistence enhancer (OpenJPA's, but any JDO or
JPA enhancer will suffer this problem).  The build process is to first
compile with ajc, then enhance, which adds a no-arg constructor.
Problem is, since the enhancer adds the constructor **after** ajc
compilation, introduced fields are not initialized.

Is there a way to introduce a constructor to any class with a given
annotation that doesn't already have a no-arg constructor of any
visibility such that field initialization takes place?  This would
prevent the enhancer from adding a no-arg constructor after aspect
compilation.

JPA Example where a UUID field is being introduced with its field
initialization inlined:

=====================
@Entity
public class Foo {
    @Id protected Long id;
    // ...
}
=====================
public interface HasUuid { UUID getUuid(); }
=====================
public aspect HasUuidMixin {
    public static interface Intro extends HasUuid {}
    declare parents:  (@Entity *) implements Intro;
    private UUID Intro.uuid = UUID.randomUUID();
    public UUID Intro.getUuid() { return uuid; }
}
=====================
// DOES NOT COMPILE
public aspect NoArgConstructorMixin {
    public ((@Entity *) && !hasmethod(* new())).new() { // can't
introduce constructors with this syntax
        // how do I ensure fields are initialized in here?  call super()?
    }
}
=====================

Thanks,
Matthew