私はスプレーjsonにあまり慣れていませんので、私は反射についての主張を守るつもりはありませんが、間違いなくあなたはProductFormats
の部分とは違っているようです。
私はcirceとArgonautとargonaut-shapelessとPlay JSONについて詳しく知っていますが、これらはすべて、ケースクラスやその他のユーザー定義型のコーデックを派生させるために一種のリフレクションを使用しています。重要なことは、これらのライブラリでは、ランタイムのリフレクションを使用しないことです。つまり、Scalaのマクロシステムによってコンパイル時に必要なフィールド名やその他の情報が決定されます。
一般的に、JavaやScalaの文脈で「リフレクション」について語るとき、それらは実行時リフレクションを意味しますが、マクロも一種のリフレクションをサポートします。したがって、私は個人的にこれらのライブラリで導出がどのように機能するかについて話します。 ランタイムが反映されていないことを指定するように注意してください。
あなたは、コンパイル時のリフレクション(またはメタプログラミング、またはそれを呼びたいと思っているもの)は、ランタイムリフレクションよりもはるかに悪いと主張することができます。それはあなたのコードをより複雑にし、悪用するのは非常に簡単ですが、ランタイムリフレクションと同じ種類の脆弱性を導入することはなく、ランタイムリフレクションと同じ方法でコードについてのあなたの能力を損なうことはありませんそうです。マクロの内容(の場合は)を理解すると、実行時に決して驚くことはありません。
タイプは基本的に、実行前に悪い可能性のあるプログラムを拒否することです。実行時のタイプについてのイントロスペクションはすべてこれを混乱させます(Erik Osheim says、「実行時のタイプに合致すれば、それを殺す」)。一方、コンパイル時の型のイントロスペクションは、コンパイラが行うものであり、マクロはプログラマとして、そのプロセスに慣れ親しんだ(または少なくともコンパイラプラグインの作成などと比べて)きれいな方法を提供します。 )。
実行時のリフレクションを避けるためにパフォーマンス上の利点があるかもしれませんが、個人的にはそれが一般的に第二の問題です。私は自分の人生に無駄な時間を浪費しています。ランタイムリフレクションに重きを置く - ランタイムリフレクションのためではない私のプログラムはわずかに遅くなります。
これは、「実行時のリフレクションはありません」という意味で「このようなリフレクションは含まれていません」と言わなければならないと言っても過言ではありません。言葉、私は、スプレーjsonのgetMethods
ものすべてを与えられたと思います)。
ありがとうございました。私の直感はマクロをまず考えた。私はjsonのライブラリでランタイムリフレクションの使用を制限する上でLi Haoyiツイートを見たことがあります。ランタイムリフレクションと同じ種類の脆弱性について何か言いたいことがありますか?なぜなら、型を派生させて、それに応じて(特にnullを)設定しなければならないからです。 – Jatin