AspectJ ITDs:实现通用接口

时间:2012-03-05 15:47:00

标签: java generics aspectj

我希望我的类实现一个接口,但我想在一个方面使用ITD提供方法的实现。 这可能吗?

接口:

public interface CloningService<T> {
    public T clone(T object);
}

默认实施:

public class DefaultCloningServiceImpl implements CloningService<T> {
    public T clone(T object) {
        // implementation of the clone method
    }
}

具体实施:

public class PersonService implements CloningService<Person> {
    // no code (!)
}

类PersonService将声明它实现了CloningService接口,但是DefaultCloningServiceImpl中将提供方法的实际实现,并且方面会将它们引入PersonService。

我在Eclipse.com上关注了示例,并尝试使用@DeclareParents来实现上述功能。但是,我从AspectJ获得编译器错误,这与泛型有关。好像@DeclareParents注释没有预料到泛型会被使用......

谢谢。

2 个答案:

答案 0 :(得分:2)

我建议您使用代码样式aspectj来解决此问题,而不是注释样式。

这可以通过这样的方面来完成:

aspect CloningServiceAspect {
  declare parents : PersonService extends DefaultCloningServiceImpl<Object>;
}

为了使其更通用并附加到注释,您可以执行以下操作:

aspect CloningServiceAspect {
  declare parents : (@CloningService *) extends DefaultCloningServiceImpl<Object>;
}

如果你想将它打包成一个独立的jar,只需确保添加你想编织的所有代码将这个jar添加到它的aspect路径(如果使用编译时编织)。

答案 1 :(得分:1)

我找到了解决方案!它涉及使用AspectJ中的@DeclareMixin注释来混合clone()方法的默认实现:

@Aspect
public class CloningServiceAspect {
    @DeclareMixin(value = "(@CloningService *)")
    public static CloningService<?> createImplementation() {
        return new DefaultCloningServiceImpl<Object>();
    }
}

然后我的服务使用@CloningService注释,而不是实现接口:

@CloningService
public class PersonService {
    // no code
}