2

であるが、で初期化され、を呼び出すようにオーバーライドするMarkupBuilderデフォルトのコンストラクターを持つ型を作成するにはどうすればよいですか?StringWritertoString()toString()StringWriter

考え方は次のようになりますが、もちろん、スーパーコンストラクターを呼び出す前にインスタンス変数を初期化することはできません。

class StringWriterMarkupBuilder extends MarkupBuilder {
    final def sw = new StringWriter()
    StringWriterMarkupBuilder() {
        super(sw)
    }

    @Override String toString() {
        sw.toString()
    }
}
4

2 に答える 2

2

申し訳ありませんが、MarkupBuilderのGroovyソースコードを掘り下げて、ようやく解決策を見つけました!:

class StringWriterMarkupBuilder extends MarkupBuilder {
    StringWriterMarkupBuilder() {
        //MarkupBuilder.this(new IndentPrinter(new PrintWriter(writer)))
        super(new StringWriter()) 
    }

    @Override String toString() {
        //IndentPrinter.PrintWriter.StringWriter
        return super.getPrinter().out.out.toString()
    }
}
于 2012-05-19T13:40:37.827 に答える
1

metaClass次のようにしてこれを行うこともできます。

import groovy.xml.MarkupBuilder

MarkupBuilder createSWMB() {
  new StringWriter().with { sw ->
    new MarkupBuilder( sw ).with { mb ->
      mb.metaClass.toString = { -> sw.toString() }
      mb
    } 
  }
}

MarkupBuilder mb = createSWMB()
mb.root {
  names {
    name( first:'tim', second:'yates' )
  }
}
println mb.toString()
于 2012-05-21T09:01:00.817 に答える