LINEスタンプ制作代行サービス・LINEスタンプの作り方!

お電話でのお問い合わせ:03-6869-8600

stampfactory大百科事典

リフレクション (情報工学)

情報工学においてリフレクション (reflection) とは、プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことを指す。日本語では自己言及と呼ばれる。通常リフレクションというと動的(実行時)リフレクションのことを指すが、静的(コンパイル時)リフレクションをサポートするプログラミング言語もある。リフレクションはSmalltalk、Java、.NET Frameworkのような仮想機械やインタプリタ上で実行されることを想定した言語でサポートされることが多く、C言語のような機械語として出力されることを想定した言語でサポートされることは少ない。一般に、リフレクションとはオブジェクトがそれ自身の構造や計算上の意味を取得することを可能にするものである。リフレクションによるプログラミングパラダイムを"リフレクティブプログラミング" ("reflective programming") という。通常、プログラムのソースコードがコンパイルされると、プログラムの構造などの情報は低レベルコード(アセンブリ言語など)に変換される過程で失われてしまう。リフレクションをサポートする場合、そのような情報は生成されるコードの中にメタデータとして保存される。LISPやForthなど実行時とコンパイル時の区別のない言語では、コードの解釈とリフレクションとの間に違いはない。次のコードはcodice_1パッケージを使ったJava 6以降での例である。どちらのコードでもcodice_2クラスのインスタンスを作成し、そのインスタンスのcodice_3メソッドを呼んでいる。前者の例では、クラス名やメソッド名がハードコーディングされているので実行時に他のクラスに変更するのは不可能である。リフレクションを用いた後者の例では、それらを実行時に容易に変更することができる。しかしその一方で、後者は読みにくく、またコンパイル時チェックの恩恵も得られない。つまり、もしcodice_2クラスが存在しなかったとしたら前者のコードではコンパイル時にエラーとなるが、後者のコードでは実行するまでエラーが発生しない。次のコードは同じ例をPerlで書いたものである。次のコードは同じ例をObjective-Cで書いたものである。次の例は同じ例を[[ActionScript]]で書いたものである。次の例は同じ例を[[JavaScript]]で書いたものである。次の例は同じ例を[[Ruby]]で書いたものである。次の例は同じ例を[[Python]]で書いたものである。obj = Foo()obj.hello()class_name = "Foo"method = "hello"obj = globals()[class_name]()getattr(obj, method)()eval("Foo().hello()")次の例は同じ例を[[PHP: Hypertext Preprocessor|PHP]]で書いたものである。// リフレクションなし$foo = new Foo();$foo->hello();// リフレクション$reflector = new ReflectionClass('Foo');$foo = $reflector->newInstance();$hello = $reflector->getMethod('hello');$hello->invoke($foo);// コールバックの使用$foo = new Foo();call_user_func(array($foo, 'hello'));// 可変変数構文の使用$className = 'Foo';$foo = new $className();$method = 'hello';$foo->$method();次の例は[[C Sharp|C#]]による例で、より進んだリフレクションの用法を示している。プログラムは[[コマンドラインインタプリタ|コマンドライン]]から[[アセンブリ (共通言語基盤)|アセンブリ]]名を入力としてとる。アセンブリとは[[ライブラリ|クラスライブラリ]]のようなものである。アセンブリが読み込まれると、アセンブリ内で定義されたメソッドを検索するためにリフレクションが用いられる。見つかった各メソッドに対し、最近変更があったかどうかをリフレクションを使って調べている。もし変更があり、かつ引数をとらないメソッドであれば、メソッド名と戻り値の型を表示する。最近変更されたかどうかを調べるために、開発者はカスタム[[メタデータ (共通言語基盤)#属性|属性]]を使う必要がある。上で使用したカスタム属性の実装を次に示す。また、このカスタム属性を使用したクラスの定義例を次に示す。次の例は同じ例を[[Delphi]]で書いたものである。クラス TFoo はユニット Unit1 で定義されているものとする。[[Delphi]] はアンマネージドでネイティブコンパイルされる言語であるため、注目に値する例となっている。リフレクションをサポートする言語の多くは [[Perl]] や [[Python]], [[PHP]] のような[[動的プログラミング言語]]または[[スクリプト言語]]であるか、あるいは [[Java]] や [[C_Sharp|C#]] のようにランタイムを必要とする言語である。[[Category:プログラミング]][[Category:プログラミングパラダイム]]

出典:wikipedia

LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。