0

String[]xtend のアクティブ アノテーションを試してみましたが、メソッド パラメーターの名前を記録するフィールドを生成できるライブ アノテーションを作成したいと考えています。

@Target(ElementType::TYPE)
@Active(typeof(ParameterRecorderProcessor))
annotation ParameterRecorder {
}

class ParameterRecorderProcessor extends AbstractClassProcessor {

    override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {

        var iii = 0;

        // add the public methods to the interface
        for (method : annotatedClass.declaredMethods) {
            if (method.visibility == Visibility::PUBLIC) {
                iii = iii + 1
                annotatedClass.addField(method.simpleName + "_" + iii) [
                    type = typeof(String[]).newTypeReference // String[] doesn't work

                    var s = ""
                    for (p : method.parameters) {
                        if(s.length > 0) s = s + ","
                        s = s + "\"" + p.simpleName + "\""
                    }
                    val ss = s

                    initializer = [
                        '''[«ss»]'''
                    ]
                ]
            }
        }
    }
}

新しく作成されたフィールドのタイプを定義するために使用していることがわかりますtypeof(String[]).newTypeReferenceが、機能しません。生成された Java コードは次のようになります。

private Object index_1;

使い部分が空いていますObjectinitializer

修正方法は?

4

1 に答える 1

1

これは私にはバグのように見えます。typeof(String).newTypeReference.newArrayTypeReference回避策として、またはより簡潔に使用することをお勧めしますstring.newArrayTypeReference

于 2013-04-02T06:21:45.467 に答える