我希望我的类实现一个接口,但我想在一个方面使用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注释没有预料到泛型会被使用......
谢谢。
答案 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
}