注釈付きの特性が与えられた場合、その特性を実装する抽象クラスを生成するにはどうすればよいですか?だから、注釈付きの特性を拡張する抽象スカラクラスをプログラムで生成する方法は?
、マイライブラリで、私はそれを次のように次のようなものを挿入したい...次のユーザーの特性...
@Neuron
trait SomeTrait {
// ...
}
を与えられた:私は知っている
abstract class SomeTraitImpl extends SomeTrait
注意与えられた形質については何もなし、それには@Neuron
と注釈されている。
質問Using Scala traits with implemented methods in Javaの答えで説明されているコンセプトを実装してASMでこれを実行しようとしましたが、このコンセプトはScalaコンパイラがバイトコードとして発行するものの表面のみをスクラッチします。私がvar、val、lazy val、abstract overrideなどのすべての可能な組み合わせをマスターすることに成功したとしても、Scalaコンパイラの次のリリースで壊れる可能性は高いです。
私はコンパイル時マクロを書くべきではないかと思われます。しかし、私はScalaのマクロのドキュメントの上に頭を下げています。どんなヒントもありがとうございます!
'@Neuron'アノテーションなしでコードを修正しますか?だから '@Nonon trait SomeTrait'は変わりませんが、' SomeTraitImpl extends SomeTraitImpl extends SomeTrait'はどこかに作成されますよね? – dveim
はい、元の特性はそのまま残しておき、新しい 'SomeTraitImpl'をその隣に挿入するだけです。 –
'@Neuron trait SomeTrait'を持つプロジェクトが' SomeTraitImpl'のプロジェクトとは別にコンパイルされていたとします(マクロはコンパイル時に機能することに注意してください)。 'SomeTraitImpl'のコードはどのように生成されますか?考えられる回避策 - 2番目のプロジェクトでもう1つのマクロ 'NeuronGenerator'を使用すると、' @ Neuron'を見つけてASTを生成するのが最善です。あなたのケースで可能ですか? – dveim