タグ付けされた質問 「reflection」

4
リフレクションを使用して汎用のセッターとゲッターを作成するのはなぜ悪い考えですか?
しばらく前に、すべての可変変数に対してゲッターとセッターを持たないようにする方法に関する質問に対するこの回答を書きました。当時、私はこれが悪い考えであると口にするのが難しい直感しか持っていませんでしたが、OPはそれを行う方法を明示的に求めていました。私はここでなぜこれが問題になるのかを検索し、この質問を見つけました。その質問の答えは、絶対に必要でない限りリフレクションを使用するのは悪い習慣であると考えているようです。 それで、特に一般的なゲッターとセッターの場合に、反射を避けるべきだという理由を誰かが言葉で表現できますか?
49 java  reflection 

6
なぜリフレクションを使用する必要があるのですか?
私はJavaが初めてです。私の研究を通じて、クラスとメソッドを呼び出し、どのメソッドが実装されているかを知るためにリフレクションが使用されることを読みました。 いつリフレクションを使用する必要がありますか?リフレクションを使用してオブジェクトをインスタンス化し、従来の方法でメソッドを呼び出すことの違いは何ですか?
29 java  reflection 

5
Java instanceof演算子はリフレクションと見なされますか?
Java演算子を使用することinstanceofは一種の反省かどうか、今日同僚と話し合いました。そして、議論はすぐに実際に反射を定義するものに進化しました。 だから、反射の定義は何ですか? そして、instanceof考慮された「反射を使用する」の使用法はありますか? さらに、instanceof反射と見なされる場合、多型も「反射を使用する」わけではありませんか?そうでない場合、違いは何ですか?

3
リフレクション:リフレクションの使用は、まだ「悪い」または「遅い」ですか?2002年以降、リフレクションで何が変わったのですか?
式または式ツリーを扱うとき、プロパティの値を設定および取得するためにリフレクションをたくさん使用していることに気付きました。リフレクションの使用がますます一般的になっているように思われました。検証用のDataAnotations、Attribute Heavy ORMなど。 それで、もし何か変わったとしたら?機械の速度だけですか?リフレクションを高速化するためにフレームワークに変更がありましたか? それとも実際に何も変わっていませんか?リフレクションを使用するのはまだ「悪い」ですか「遅い」ですか?
21 .net  reflection 

6
リフレクションを(過剰に)使用するのは悪い習慣ですか?
定型コードの量を大幅に減らす場合は、リフレクションを使用することをお勧めしますか? 基本的に、一方の側でパフォーマンスとおそらく読みやすさと、他方の側で定型コードの抽象化/自動化/削減との間にトレードオフがあります。 編集:推奨されるリフレクションの使用例を次に示します。 例として、Base10個のフィールドと3個のサブクラスSubclassAをSubclassB持ち、SubclassCそれぞれが10個の異なるフィールドを持つ抽象クラスがあるとします。それらはすべて単純なBeanです。問題は、2つのBase型参照を取得し、対応するオブジェクトが同じ(サブ)型であり、等しいかどうかを確認することです。 ソリューションとしては、最初にタイプが等しいかどうかをチェックしてからすべてのフィールドをチェックするか、リフレクションを使用して同じタイプであるかを動的に確認し、「get」(convention構成上)、両方のオブジェクトでそれらを呼び出し、結果で等しいを呼び出します。 boolean compare(Base base1, Base, base2) { if (base1 instanceof SubclassA && base2 instanceof SubclassA) { SubclassA subclassA1 = (SubclassA) base1; SubclassA subclassA2 = (SubclassA) base2; compare(subclassA1, subclassA2); } else if (base1 instanceof SubclassB && base2 instanceof SubclassB) { //the same } //boilerplate } boolean compare(SubclassA …

6
リフレクションはプライベート変数を制限できないので不利ですか?
private修飾子は、クラス外部からのアクセスを制限するために使用されていますが、反射他のクラスを使用すると、プライベートメソッドとフィールドにアクセスすることができます。ですから、もしそれが要件の一部であるなら、どうやってアクセシビリティを制限できるのだろうと思っています。

1
メタサーキュラーインタープリター、仮想マシン、パフォーマンスの向上の関係は何ですか?
私はWeb上のメタ循環インタープリター(SICPを含む)について読み、いくつかの実装(PyPyやNarcissusなど)のコードを調べました。 私は、メタサーキュラー評価を大いに活用した2つの言語、LispとSmalltalkについてかなり読みました。私の知る限り、Lispは最初のセルフホスティングコンパイラであり、Smalltalkは最初の「真の」JIT実装を備えていました。 私が完全に理解していないことの1つは、これらのインタープリター/コンパイラーがどのように非常に優れたパフォーマンスを達成できるか、言い換えれば、PyPyがCPythonよりも速いのはなぜですか?それは反射のためですか? また、Smalltalkの研究により、JIT、仮想マシン、リフレクションの間に関係があると信じるようになりました。JVMやCLRなどの仮想マシンは、大量の型内観を許可し、Just-in-Time(およびAOT、私はそうですか?)コンパイルでそれを大いに活用すると信じています。しかし、私の知る限り、仮想マシンは基本的な命令セットを持っているという点で、CPUのようなものです。仮想マシンには、言語に依存しないリフレクションを可能にするタイプおよび参照情報が含まれているため、効率的ですか? インタプリタ言語とコンパイル言語の両方がバイトコードをターゲット(LLVM、Parrot、YARV、CPython)として使用しており、JVMやCLRなどの従来のVMのパフォーマンスが信じられないほど向上したためです。私はそれがJITについてだと言われましたが、私が知る限り、JITはJavaの前にSmalltalkとSunのSelfがそれを行っていたので、新しいものではありません。過去にVMのパフォーマンスが特に良くなかったことを覚えていません。JVMや.NET以外に学術的なものは多くなく、それらのパフォーマンスは間違いなく今ほど良くありませんでした個人的な経験から話してください)。 その後、突然、2000年代後半に何かが変わり、確立された言語でさえ多くのVMがポップアップし始め、非常に優れたパフォーマンスを発揮しました。ほとんどすべての最新のVMのパフォーマンスが飛躍的に向上したJIT実装について何か発見されましたか?紙か本か?

3
リフレクションを通じてプライベートメソッドが呼び出される状況に対処する必要がありますか?
ライブラリを作成するとき、同じクラスの他のメソッドではなく、リフレクションを通じて別のライブラリによって呼び出されたときに、プライベートメソッドが期待どおりに動作することを確認する必要がありますか? たとえば、プライベートメソッドが以下をprivate DoSomething(int number)期待している場合: number は、ゼロ以外の正の整数であり、次のとおりです。 プライベート変数string abcはnullではなく、空の文字列でもありません。 そして、完全に、これらの2つの条件が一致しない場合、い失敗します。クラスのすべてのメソッドが常に空でない値を割り当てて、をabc呼び出す前にこれらの失敗を処理する必要がありDoSomething、これに正の非ゼロ整数を渡します方法? 言い換えると、リフレクションによる安全でない呼び出しから保護されていないコードは低品質コードと見なすことができますか、それともリフレクションを使用して呼び出しが何も中断しないことを保証する呼び出し元に属しますか? 注:私の質問は、ライブラリの標準セットのみを対象としています。これは、高度に安全でなければならないコード(つまり、予期しない動作やクラッシュをさせるためにリフレクションを使用することに興味がある場合)をカバーしません。 ¹他の開発者がこのメソッドを壊さないようにするための十分な単体テストがあるため、クラスが正しく文書化されているため

4
リフレクションを介して呼び出されるメソッドをマークするためのベストプラクティス?
私たちのソフトウェアには、リフレクションを介して動的に検出されるいくつかのクラスがあります。すべてのクラスには、リフレクションコードがオブジェクトをインスタンス化する特定のシグネチャを持つコンストラクターがあります。 ただし、誰かがメソッドが参照されているかどうか(Visual Studio Code Lensなどを介して)を確認すると、リフレクションを介した参照はカウントされません。人々はそれらの参照を見逃し、明らかに未使用のメソッドを削除(または変更)することができます。 リフレクションを介して呼び出されるメソッドをマーク/ドキュメント化するにはどうすればよいですか? 理想的には、メソッドは、同僚とVisual Studio / Roslynおよび他の自動化ツールの両方が、メソッドがリフレクションを介して呼び出されることが意図されていることを「確認」するような方法でマークする必要があります。 使用できる2つのオプションを知っていますが、どちらも十分に満足できるものではありません。Visual Studioは参照を見つけることができないので: カスタム属性を使用して、この属性でコンストラクタをマークします。 問題は、Attributeプロパティをメソッド参照にすることはできないため、コンストラクターは参照が0と表示されることです。 カスタム属性に慣れていない同僚はおそらくそれを無視するでしょう。 私の現在のアプローチの利点は、リフレクションパーツが属性を使用して、呼び出すコンストラクターを見つけることができることです。 コメントを使用して、メソッド/コンストラクターがリフレクションを介して呼び出されることを意図していることを文書化します。 自動化ツールはコメントを無視します(同僚もそうするかもしれません)。 XMLドキュメントコメントは、 Visual Studioがメソッド/コンストラクタへの追加の参照をカウント持つように使用することができます させるMyPluginそのコンストラクタ反射を経由して起動するためのクラスです。呼び出しリフレクションコードが、intパラメーターを受け取るコンストラクターを検索するとします。次のドキュメントでは、そのコードlensに、1つの参照を持つコンストラクターを示しています。 /// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection より良いオプションはどれですか? リフレクションを介して呼び出されることを意図したメソッド/コンストラクターをマークするためのベストプラクティスは何ですか?

3
関数のランタイムインポートを可能にするC ++プログラムの設計方法
本日は、特定のソフトウェアアーキテクチャを実現するためのC ++の機能についてお伺いします。 もちろん、私は検索を使用しましたが、直接リンクされた回答は見つかりませんでした。 基本的に、私の目標は、ユーザーが任意に構成された物理システム(運転中の自動車など)のモデリングとシミュレーションを行えるプログラムを構築することです。私は、物理モデル(クラス内の関数)のライブラリがあると想定しています。各関数は、基礎となる物理的記述に応じて、いくつかの入力を持ち、いくつかの出力を返す場合があります。たとえば、燃焼エンジンモデル、空力抵抗モデル、ホイールモデルなどです。 ここでのアイデアは、ユーザーが自分のニーズに応じて任意の機能を構成できるようにするフレームワークをユーザーに提供することです。つまり、物理的な動作をマップすることです。フレームワークは、さまざまな機能の出力と入力を接続する機能を提供する必要があります。したがって、フレームワークはコンテナークラスを提供します。これをCOMPONENTと呼び、1つまたは複数のモデルオブジェクト(FUNCTION)を保持できます。これらのコンテナーは、他のコンポーネント(複合パターンを参照)や、関数パラメーター間の接続(CONNECTOR)も保持できます。さらに、コンポーネントクラスは、数学ソルバーなどのいくつかの一般的な数値機能を提供します。 関数の構成は実行時に行う必要があります。最初の例では、ユーザーは、コンポジション構造を定義するXMLをインポートすることでコンポジションをセットアップできる必要があります。その後、GUIを追加することを考えることができます。 ここで理解を深めるために、非常に単純化した例を示します。 <COMPONENT name="Main"> <COMPONENT name="A"> <FUNCTION name="A1" path="lib/functionA1" /> </COMPONENT> <COMPONENT name="B"> <FUNCTION name="B1" path="lib/functionB1" /> <FUNCTION name="B2" path="lib/functionB2" /> </COMPONENT> <CONNECTIONS> <CONNECTOR source="A1" target="B1" /> <CONNECTOR source="B1" target="B2" /> </CONNECTIONS> </COMPONENT> 私の問題ははるかに一般的であるため、フレームワークの機能について詳しく説明する必要はありません。フレームワークのコード/プログラムがコンパイルされたとき、物理的な問題の説明とユーザー定義関数は不明です。ユーザーが(XMLまたは後でGUIを介して)関数を選択すると、フレームワークは関数情報を読み取る必要があります。つまり、ユーザーに関数を相互接続するオプションを提供するために、入力パラメーターと出力パラメーターの情報を取得する必要があります。 私はリフレクションの原理を知っており、C ++がこの機能を提供していないことを知っています。ただし、「実行時にオブジェクトを構築する」という概念は非常に頻繁に必要になると思います。目標を達成するには、C ++でソフトウェアアーキテクチャをどのように設定すればよいですか?C ++は正しい言語ですか?私は何を見落としていますか? 前もって感謝します! 乾杯、オリバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.