我拥有一个附有习惯说明的广域网各组成部分的图书馆@ReferencedResource
或另一个注释@ReferencedResources
,该图书馆有ReferencedResouce[] Value(
, para amount to take multi note.
这里是一部法规样本:
@ReferencedResources({
@ReferencedResource(value = Libraries.MOO_TOOLS, type = ResourceType.JAVASCRIPT),
@ReferencedResource(value = "behaviors/promoteSelectOptions", type = ResourceType.JAVASCRIPT) })
public class PromoteSelectOptionsBehavior extends AbstractBehavior{
...
}
到目前为止,我使用apt,以核实参考资源确实存在。 E.g.
@ReferencedResource(value = "behaviors/promoteSelectOptions",
type = ResourceType.JAVASCRIPT)
除非文件js/behaviors/promoteSelectOptions.j
在班上找到,否则将造成汇编失败。 这一部分非常可行。
现在,我也是南盟的狂热人物,我也想利用同样的说明,在美帝国成立时,实际上向它们注入资源。 我利用AspectJ执行了其中一部分。
附加说明的物体通常有以下两种情况:Component 或AbstractBehavior。
对部件而言,事情很容易,在建筑商之后就好了。 此处建议:
pointcut singleAnnotation() : @within(ReferencedResource);
pointcut multiAnnotation() : @within(ReferencedResources);
after() : execution(Component+.new(..)) && (singleAnnotation() || multiAnnotation()){
final Component component = (Component) thisJoinPoint.getTarget();
final Collection<ReferencedResource> resourceAnnotations =
// gather annotations from cache
this.getResourceAnnotations(component.getClass());
for(final ReferencedResource annotation : resourceAnnotations){
// helper utility that handles the creation of statements like
// component.add(JavascriptPackageResource.getHeaderContribution(path))
this.resourceInjector.inject(component, annotation);
}
}
然而,为了采取行动,我需要把资源放在对策上,而不是放在行为本身上。 我使用的是:
pointcut renderHead(IHeaderResponse response) :
execution(* org.apache.wicket.behavior.AbstractBehavior+.renderHead(*))
&& args(response);
这里的建议是:
before(final IHeaderResponse response) :
renderHead(response) && (multiAnnotation() || singleAnnotation()) {
final Collection<ReferencedResource> resourceAnnotations =
this.getResourceAnnotations(thisJoinPoint.getTarget().getClass());
for(final ReferencedResource resource : resourceAnnotations){
this.resourceInjector.inject(response, resource);
}
}
如果该类别超越了 /renderHead(response),但在许多情况下,没有必要,因为超级班子已经执行基础功能,而儿童班子只增加一些。 因此,一种解决办法是让这些阶层确定这样一种方法:
@Override
public void renderHead(IHeaderResponse response){
super.renderHead(response);
}
我会对此表示仇恨,因为这是一部死亡法典,但目前这是我所看到的唯一工作选择,因此我正在寻求其他解决办法。
EDIT:
我利用APT和Sainjavac电话建立了工作解决办法。 然而,这导致下一个问题:Running APT and AspectJ in the same project using maven。
无论如何,只要我有一段自由的时间,我就将回答这个问题(或部分问题)。