2015-11-07 14 views
8

私は非常に簡単な質問があります。これはスプレー・ジョンソンには当てはまりませんが、私はアルゴンヌとケイシーと同様の主張をしています。だから私を啓発してください。説明のために - 反射が含まれていません

スプレー・ジャーソンでは、私はThere is no reflection involvedと言っています。ユーザーがJsonFormatを提供し、すべてがうまくいけば、型クラスに基づくアプローチについて理解しています。しかし、このクレームはDefaultJsonProtocolを使用する場合も同じですか?

thisを見ると、clazz.getMethods,clazz.getDeclaredFieldsなどの使用がわかるので、これは反射の使用法ですか?もちろん、反射を使ってJavaの世界とは違った設定を心配する必要はありません。object#applyに感謝します。しかしフィールド名を読むのには少なくとも、私は反射がどのように見えているか理解していません。

答えて

16

私はスプレーjsonにあまり慣れていませんので、私は反射についての主張を守るつもりはありませんが、間違いなくあなたはProductFormatsの部分とは違っているようです。

私はcirceとArgonautとargonaut-shapelessとPlay JSONについて詳しく知っていますが、これらはすべて、ケースクラスやその他のユーザー定義型のコーデックを派生させるために一種のリフレクションを使用しています。重要なことは、これらのライブラリでは、ランタイムのリフレクションを使用しないことです。つまり、Scalaのマクロシステムによってコンパイル時に必要なフィールド名やその他の情報が決定されます。

一般的に、JavaやScalaの文脈で「リフレクション」について語るとき、それらは実行時リフレクションを意味しますが、マクロも一種のリフレクションをサポートします。したがって、私は個人的にこれらのライブラリで導出がどのように機能するかについて話します。 ランタイムが反映されていないことを指定するように注意してください。

あなたは、コンパイル時のリフレクション(またはメタプログラミング、またはそれを呼びたいと思っているもの)は、ランタイムリフレクションよりもはるかに悪いと主張することができます。それはあなたのコードをより複雑にし、悪用するのは非常に簡単ですが、ランタイムリフレクションと同じ種類の脆弱性を導入することはなく、ランタイムリフレクションと同じ方法でコードについてのあなたの能力を損なうことはありませんそうです。マクロの内容(の場合は)を理解すると、実行時に決して驚くことはありません。

タイプは基本的に、実行前に悪い可能性のあるプログラムを拒否することです。実行時のタイプについてのイントロスペクションはすべてこれを混乱させます(Erik Osheim says、「実行時のタイプに合致すれば、それを殺す」)。一方、コンパイル時の型のイントロスペクションは、コンパイラが行うものであり、マクロはプログラマとして、そのプロセスに慣れ親しんだ(または少なくともコンパイラプラグインの作成などと比べて)きれいな方法を提供します。 )。

実行時のリフレクションを避けるためにパフォーマンス上の利点があるかもしれませんが、個人的にはそれが一般的に第二の問題です。私は自分の人生に無駄な時間を浪費しています。ランタイムリフレクションに重きを置く - ランタイムリフレクションのためではない私のプログラムはわずかに遅くなります。

これは、「実行時のリフレクションはありません」という意味で「このようなリフレクションは含まれていません」と言わなければならないと言っても過言ではありません。言葉、私は、スプレーjsonのgetMethodsものすべてを与えられたと思います)。

+0

ありがとうございました。私の直感はマクロをまず考えた。私はjsonのライブラリでランタイムリフレクションの使用を制限する上でLi Haoyiツイートを見たことがあります。ランタイムリフレクションと同じ種類の脆弱性について何か言いたいことがありますか?なぜなら、型を派生させて、それに応じて(特にnullを)設定しなければならないからです。 – Jatin

関連する問題