Java AspectJ ITDs:实现通用接口

Java AspectJ ITDs:实现通用接口,java,generics,aspectj,Java,Generics,Aspectj,我希望我的类实现一个接口,但我希望在一个方面提供使用ITD的方法的实现这可能吗? 接口: public interface CloningService<T> { public T clone(T object); } 公共接口关闭服务{ 公共T克隆(T对象); } 默认实现: public class DefaultCloningServiceImpl implements CloningService<T> { public T clone(T o

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

接口:

public interface CloningService<T> {
    public T clone(T object);
}
公共接口关闭服务{
公共T克隆(T对象);
}
默认实现:

public class DefaultCloningServiceImpl implements CloningService<T> {
    public T clone(T object) {
        // implementation of the clone method
    }
}
public class PersonService implements CloningService<Person> {
    // no code (!)
}
公共类DefaultCloningServiceImpl实现CloningService{
公共T克隆(T对象){
//克隆方法的实现
}
}
具体实施:

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{
//没有代码(!)
}
类PersonService将声明它实现CloningService接口,但方法的实际实现将在DefaultCloningServiceImpl中提供,并且一个方面将向PersonService介绍这些方法

我遵循Eclipse.com上的示例,并尝试使用@DeclareParents实现上述功能。然而,我从AspectJ得到了一个编译器错误,这与泛型有关。就好像@DeclareParents注释没有期望使用泛型一样


谢谢。

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


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

这可以通过以下方式简单实现:

aspect CloningServiceAspect {
  declare parents : PersonService extends DefaultCloningServiceImpl<Object>;
}
aspect CloningServiceAspect {
  declare parents : (@CloningService *) extends DefaultCloningServiceImpl<Object>;
}
方面CloningServiceAspect{
声明父项:PersonService扩展DefaultCloningServiceImpl;
}
要使其更通用并附加到注释,可以执行以下操作:

aspect CloningServiceAspect {
  declare parents : PersonService extends DefaultCloningServiceImpl<Object>;
}
aspect CloningServiceAspect {
  declare parents : (@CloningService *) extends DefaultCloningServiceImpl<Object>;
}
方面CloningServiceAspect{
声明父项:(@CloningService*)扩展DefaultCloningServiceImpl;
}

如果您想将其打包到一个独立的jar中,只需确保添加所有要编织的代码即可将此jar添加到其方面路径(如果使用编译时编织)。

Andrew,谢谢您的回答。这听起来是个好主意,但我有两个问题:(1)注释样式aspectj不是首选吗?我的重点是这是最好的做法。(2) 您提供的代码扩展了PersonService,但我想扩展所有由注释标记的服务(或者实际上是这样),因为我想将此逻辑放在一个单独的JAR中。有没有更好的解决方案?不,注释样式不是首选。一个原因是,这些工具与注释样式的配合不太好。此外,还有一些事情是注释样式无法完成的(例如,类型间声明)。人们选择注释样式而不是代码样式的主要原因是,他们希望自己的代码可以由标准Java编译器编译(然后在其上运行weaver)。