【问题标题】:Automatic Interface Implementation via Xtend ActiveAnnotations通过 Xtend ActiveAnnotations 实现自动接口
【发布时间】:2017-07-08 01:55:50
【问题描述】:

假设我有一个 Java 接口:

public interface IMyInterface {
    void hello(String who);
}

我想使用 Xtend 创建一个活动注释,它会自动(并且通常)为 Xtend 类实现该接口。所以,当我写的时候

@InterfaceImplementor
class MyInterfaceImplementation implements IMyInterface {       
} 

我希望 Xtend 生成

@InterfaceImplementor
@SuppressWarnings("all")
public class MyInterfaceImplementation implements IMyInterface {
  public void hello(final String who) {
    delegate.hello(who);
  }
}

我到此为止:

@Active(typeof(ImplementationGenerator))
annotation InterfaceImplementor{}

class ImplementationGenerator implements TransformationParticipant<MutableClassDeclaration> {

    override doTransform(List<? extends MutableClassDeclaration> annotatedTargetElements, extension TransformationContext context) 
    {
        for(element : annotatedTargetElements)
        {
            for(method : element.declaredMethods) 
            {
                implementMethod(element, method, context)               
            }
        }
    }

    def implementMethod(MutableClassDeclaration clazz, MutableMethodDeclaration method, extension TransformationContext context) 
    {
        method.body = ['''delegate.«method.simpleName»(«method.callParameters»);''']
    }

    def callParameters(MutableMethodDeclaration method) 
    {
        method.parameters.map[ simpleName ].join(', ')
    }
}

只要我覆盖目标类中的每个方法,它就可以工作:

@InterfaceImplementor
class MyInterfaceImplementation implements IMyInterface {       

    override hello(String who) {}

} 

但是,我实际上希望 Xtend 生成整个类主体,而不必手动声明每个方法。为此,我尝试在活动注释中使用element.implementedInterfaces,但这些只是TypeReferences,我不知道如何从类型引用中获取声明的方法。所以这就是我卡住的地方。

在活动注释评估期间甚至可以解决TypeReference 吗?还有其他方法可以实现我的目标吗?

【问题讨论】:

    标签: java code-generation xtend


    【解决方案1】:

    "element.declaredMethods" 返回本地声明的方法(即在您的情况下为空)。你需要遍历实现的接口的方法,然后在当前注解目标中创建新的方法。

    【讨论】:

    • 如何从实现的接口中获取方法?我可以得到element.implementedInterfacesTypeReference。但是如何获取被引用接口声明的方法呢?
    • 啊,明白了。 TypeReference 有一个 getType() 方法,它返回一个 Type 可以转换为 InterfaceDeclaration。那是缺失的部分。谢谢你,斯文!
    【解决方案2】:

    您还可以查看新的 Xtend 内置 @Delegate 注解。

    此示例取自发行说明 (https://eclipse.org/xtend/releasenotes.html):

    interface I {
       def void m1()
       def void m2()
       def void m3()
    }
    class A implements I {
       override m1() {}
       override m2() {}
       override m3() {}
    }
    class B implements I {
       //all methods automatically implemented
       @Delegate A delegate = new A
    }
    

    这里是 Xtend 在线文档中相关部分的链接:https://eclipse.org/xtend/documentation/204_activeannotations.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多