質問

何が反射し、なぜですか。

し、その一例となっているJavaが、この原則は同じだが、使用言語を問いません。

役に立ちましたか?

解決

その名は、リフレクションが使用され記述するコードできる検査その他のコードを同じシステム(または)。

例えば、言いオブジェクトの未知の型はJavaでは、呼び出したいの"doSomethingの方法で合が存在します。Javaの静的タイピングシステムの最初がやりたかっただけで支援のためのない限り、このオブジェクトに認知られるインタフェースを活用した反射コードを見ることができるオブジェクトは、見出されている場合の方法と呼ばれるdoSomething、その後電話をしています。

なっていただけるようにしたコード例ではこのJava想のためのオブジェクトであるというfoo):

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

一つのものを使用の場合にはJavaは使いたアンソロジー。JUnit4例えば、反射と同じクラスのための方法でタグ付けを試験アノテーションは、呼び出して実行する場合にユニットテストです。

がいくつかの良い反例を使ったので http://docs.oracle.com/javase/tutorial/reflect/index.html

そして、その概念はかなり類似するその他の静的型言語支援の反射(C#).ダ入力言語を使用の場合上記は必要でコンパイラにより任意のメソッドが呼び出されるオブジェクトにも十実行時に存在しない場合は、もうひとつのケースの探し方法については一定の方法によってはまだ一般的です。

更新からのコメント:

する機能を検査コードのシステム参照オブジェクトの種類は な反射ではなくタイプます。反射、あるいはその 力の変更によって、実行時に利用 ます。の区別は必要なことしての言語 支援内観も対応していない。例えば、 C++

他のヒント

反射 は言語能力検査は、動的に呼び授業方法の属性等を行います。

例えば、すべてのオブジェクトにJavaの方法 getClass(), きを決定するようになるオブジェクトのクラスの場合にも知らないのでコンパイル時の例ればこれまでのとして Object 今という見方もあるかもしれないが些細なものなどを反映できないの少ない動的言語などの C++.より高度に利用しきリストを呼び出方法、コンストラクタ。

反射異なることを明らかにしできるようなプログラムを書くい"知"すべてコンパイル時には、動が可能ですのでとします。このコードで書き込まれる対知られたインタフェースが、実際の授業として使用することができるがインスタンスを生成反射から構成ファイルです。

多くの近代の枠組みに使用反射幅広くことも理由です。他のほとんどの現代語-現代の使用を反映して、スクリプト言語など、ワニやPythonのような)も統合で感じ自然の一般プログラミングモデルの方の言語である。

私の好きな用途の反射は以下のとおりです。Javaのダンプ法です。このanyオブジェクトとしてパラメータを使用してJavaを反映するためのAPIを印刷すべてのフィールド名およびフィールドの値です。

import java.lang.reflect.Array;
import java.lang.reflect.Field;

public static String dump(Object o, int callCount) {
    callCount++;
    StringBuffer tabs = new StringBuffer();
    for (int k = 0; k < callCount; k++) {
        tabs.append("\t");
    }
    StringBuffer buffer = new StringBuffer();
    Class oClass = o.getClass();
    if (oClass.isArray()) {
        buffer.append("\n");
        buffer.append(tabs.toString());
        buffer.append("[");
        for (int i = 0; i < Array.getLength(o); i++) {
            if (i < 0)
                buffer.append(",");
            Object value = Array.get(o, i);
            if (value.getClass().isPrimitive() ||
                    value.getClass() == java.lang.Long.class ||
                    value.getClass() == java.lang.String.class ||
                    value.getClass() == java.lang.Integer.class ||
                    value.getClass() == java.lang.Boolean.class
                    ) {
                buffer.append(value);
            } else {
                buffer.append(dump(value, callCount));
            }
        }
        buffer.append(tabs.toString());
        buffer.append("]\n");
    } else {
        buffer.append("\n");
        buffer.append(tabs.toString());
        buffer.append("{\n");
        while (oClass != null) {
            Field[] fields = oClass.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                buffer.append(tabs.toString());
                fields[i].setAccessible(true);
                buffer.append(fields[i].getName());
                buffer.append("=");
                try {
                    Object value = fields[i].get(o);
                    if (value != null) {
                        if (value.getClass().isPrimitive() ||
                                value.getClass() == java.lang.Long.class ||
                                value.getClass() == java.lang.String.class ||
                                value.getClass() == java.lang.Integer.class ||
                                value.getClass() == java.lang.Boolean.class
                                ) {
                            buffer.append(value);
                        } else {
                            buffer.append(dump(value, callCount));
                        }
                    }
                } catch (IllegalAccessException e) {
                    buffer.append(e.getMessage());
                }
                buffer.append("\n");
            }
            oClass = oClass.getSuperclass();
        }
        buffer.append(tabs.toString());
        buffer.append("}\n");
    }
    return buffer.toString();
}

利用の反射

反射光によって共通的に使用されているプログラムを必要とする機能を検討しくは変更の実行時の挙動、プレゼンテーションは、Java仮想マシン。これは比較的高度な機能のみ使用する必要がある開発者の強い基礎の開されたものの翻訳であります。この点に注意思を反映する強力な技術を応用操作を行うさいは不可能です。

拡張性の特徴

アプリケーションの外部ユーザー定義の授業の創造のインスタンスの拡張性を使用したオブジェクトを完全修飾名です。クラスブラウザおよび視覚の開発環境 クラスブラウザのニーズをできる列挙のメンバー。視覚の開発環境での使用にタイプの情報を反映を支援する開発者に文書訂正コードです。デバッガおよびテストツール デバッガできることを必要を検討個人会員ます。試ハーネスを使っているので反射体系的に呼含定のApiで定義されているクラスを確実なものとするための高レベルのコードカバレッジは、テストスイート

欠点の反射

反射が強い力が使用されるべきでは無差別に.ことが可能であれば、その操作を使用せずに反射していることが好ましい使用は避けます。以下の懸念に留意すべき場合、アクセスコードを経由す。

  • 性能架

での反射にはグラフの種類を動的に解決し、一部のJava仮想マシンの最適化はできません。その結果、反射事業の業績が下り坂になり非反射型カウンターパート、輸入-輸出が全部可能ですのでコードのセクションと呼ばれる多くの性能-感度。

  • セキュリティ上の制約

反射が必要で、実行時アクセス権を与える恐れがあるため現することができ、セキュリティマネージャ.これは重要な検討のためのコードを実行制限のセキュリティコンテキストなどのアプレット.

  • 露出の内部

らの反射できるコードによる業務を行っている違法非反射コードへのアクセスなど個人分野と方法の使用を反映す予期せぬ副作用を描画するコードの機能不全に陥破棄することができる能。反射型コードの休憩に抽象化し変化挙動を更新しました。

ソース: の反射API

反射するためのキーメカニズムを使用すると、アプリケーション体制や仕組みを作るコードなにも書かれてい関する詳細を策定したものです。

例えば、典型的なweb.xml ファイルです。このリストをサーブレット要素に含まれるネストしたサーブレットクラスです。サーブレットコンテナ研修事業サポート,中国ビジネスのweb.xml ファイルや新規作成新しいインスタンスのサーブレットクラスを通じて反射を生み出します。

また別の例Java API for XML構文解析 (JAXP).がXMLパーサープロバイダは"即'通知システムプロパティに使用される新規インスタンスを通じて反射を生み出します。

そして、最も包括的な例である 利用への反映を、豆類、およびその利用のプロキシ

な言語対応の反射の原理は同じ言語支援します。

反射の反映""構造に関する。以上のリンクです。眺めのオブジェクトの授業でプログラムを使っくり戻し情報は、法分野やインターフェースも実行します。すもうアンソロジー。

での練を多く実現しました。もんきに動的にプラグインの授業へのコードです。多くのオブジェクトリレーショナルmappers利用への反映できるインスタンスを生成するオブジェからのデータベースを知らずに事前に何物にも利用します。プラグインの建築は別の場所での反射が置す.できる動的に負荷のコードを定めがある場合が実は正しいインターフェイスとして利用プラグインが重要です。

反射できるインスタンス生成の新しい物メソッドの呼び出しの方法、取得/設定操作のクラス変数を動的に実行時になく事前知識の実装されます。

Class myObjectClass = MyObject.class;
Method[] method = myObjectClass.getMethods();

//Here the method takes a string parameter if there is no param, put null.
Method method = aClass.getMethod("method_name", String.class); 

Object returnValue = method.invoke(null, "parameter-value1");

上の例の場合は、nullパラメータジへのアクセスにはログインしたいメソッドを呼び出する。このメソッドは静的またはnullです。このメソッドは静止しながらの呼び出しを提供する必要があり、有効なMyObjectインスタンスの代わりにnullになります。

反射光も利用いただくことができ個人会員/法のクラス:

public class A{

  private String str= null;

  public A(String str) {
  this.str= str;
  }
}

.

A obj= new A("Some value");

Field privateStringField = A.class.getDeclaredField("privateString");

//Turn off access check for this field
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(obj);
System.out.println("fieldValue = " + fieldValue);
  • 検査の授業として、省)だと思うので輸入の反射パッケージjava.lang.reflect).クラスのメタデータアクセスできるよ java.lang.Class.

反射は非常に強力なAPIでの応用超えて使用されますので、解決すべての種類で行います。

例:
たとえばリモートアップが引き出せるようにすることapplicationオブジェクトでの取得をAPIです。現在のオブジェクトに必要がある場合があります行う計算機、などがあげられます。
プロバイダを保証するオブジェクトの3種類がありますしを行う計算に基づきどのようなオブジェクトです。
いっそのことを実施3つの授業がそれぞれ別の論理です。このオブジェクトの情報はランタイムはありませんが静的コードを計算では、リフレクションが使用されインスタンスを生成するのオブジェクトのクラスすることだと思いますが、計算に基づくオブジェクトのプロバイダです。

Javaの反射は非常に強力で非常に便利です。Javaの反射が可能で 検査のクラス、インターフェイス、メソッドおよびランタイム時において、 ることを知らずの名前授業方法等コンパイルす。ることも可能で インスタンスを生成新しい物を呼び出す方法や取得/設定フィールド値を使用している。

クJava反例を示すかを反映次のように記述されています。

Method[] methods = MyObject.class.getMethods();

    for(Method method : methods){
        System.out.println("method = " + method.getName());
    }

この例で得られるClassオブジェクトのクラスと呼ばれMyObject.のクラスオブジェクトの例がリストにあるクラスを繰り返して調べての方法および印刷していただきつけられた名前が使われている。

正確にどのようにこの作品について、説明いたします

編集:後ほぼ1年の私の編集この答えとして読み込み中に約を反映した数までの反射を生み出します。

  • 春に使豆の設定など


<bean id="someID" class="com.example.Foo">
    <property name="someField" value="someValue" />
</bean>

が、春の文脈でこのプロセス < 豆>要素です。forName(String)の引数に"com.例です。Foo"のインスタンスを生成するクラスです。

その後は再び利用の反射を取得し、適切なセッターの < 財>要素の設定値を、指定された値です。

  • Junit用反射特に試験用のプライベート/保護されます。

民法

Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

民間分野

Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);

って、私の理解

反射できるプログラマーへのアクセス主体のプログラムます。すなわちを符号化する場合、お申込みプログラマが知らなかつクラスまたはその方法、そのようなクラスを動的に(実行時に使用している。

用途に多く使用されているシナリオがクラス名が変化します。の場合のような状況が生じた場合は、その複雑なため、プログラマに書き換えの変化クラスの名前。

代わりに、反射する必要があり心配が変化するクラスの名前です。

反射 あるAPIを用いて検討しくは変更の挙動 方法、クラス、インターフェイス を行います。

  1. のに必要な授業のための反射をご提供してい java.lang.reflect package.
  2. 反射与に関する情報はクラスオブジェクトが属するとともにそのクラスで実行できるようにオブジェクトです。
  3. を反射しを呼び出す方法で実行時にかかわらず、アクセス指定子を使用します。

java.langjava.lang.reflect パッケージの提供のクラスjavaす。

反射 可を取得するために使用される情報–

  1. クラスgetClass() 方法を取得するために使用されるクラスの名前をオブジェクト。

  2. コンストラクタgetConstructors() 方法を取得するために使用されるのpublicコンストラクタのクラスオブジェクト。

  3. 方法getMethods() 方法を取得するために使用されるのpublicメソッドのクラスは、オブジェが所属する

反射API に主に使われています:

IDE(統合開発環境)などEclipse MyEclipse,Xsltproc。
デバッガおよびテストツール。

利用のメリットの反射:

拡張性の特徴: アプリケーションの外部ユーザー定義の授業の創造のインスタンスの拡張性を使用したオブジェクトを完全修飾名です。

デバッグおよびテストツール: デバッガ用の反射を検討個人会員。

欠点:

性能架: 反射事業の業績が下り坂になり非反射と、輸入-輸出が全部可能ですのでコードのセクションと呼ばれる多くの性能-感度。

露出の内部は: 反射型コードの休憩に抽象化およびその変更の振る舞いを更新しました。

Ref: Java反射 javarevisited.blogspot.に

反射の機能を利用いただくことができ、実行時アクセス情報のプログラム修正するという手順になり挙動(一部制限).

便利であるとはいえるでしょうかを変更することができます。runtime behaivourによってデータベースのようなデータの情報のプログラムは、チェックすることができる戻り値の型の機能にできるようになることに取り扱います。

クライアントまで、フルのC#設定できるようにし、また荷重の組立(a.dll)のようにランタイム時において、検討す際の授業や活動にはどのようだ。まだ作成クラスのインスタンスにランタイム時において、呼び出し方法。

ができる。は有用ではないの詳細がコンクリートです。例えば利用できるので、名前のクラスログの目的は、dinamicallyをハンドラがイベントにはどのように指定する指定は、設定ファイルで...

簡単な例に対す。に将棋ゲーム、あなたはわかっていないかして移動することになるのユーザーです。反射できるの呼び出しに使用する方法で実施します。

public class Test {

    public void firstMoveChoice(){
        System.out.println("First Move");
    } 
    public void secondMOveChoice(){
        System.out.println("Second Move");
    }
    public void thirdMoveChoice(){
        System.out.println("Third Move");
    }

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
        Test test = new Test();
        Method[] method = test.getClass().getMethods();
        //firstMoveChoice
        method[0].invoke(test, null);
        //secondMoveChoice
        method[1].invoke(test, null);
        //thirdMoveChoice
        method[2].invoke(test, null);
    }

}

反射するようにオブジェクトへの参照。この引数のような反射を生み出します。実際、この"自己"を認定する。

反射そのものは単語などの言語にその能力の自己知と自己-コミュニケーション科学基礎研究Java-C#.していないための能力の自己認識を用いることにより状態を観察どうしても反映させようとするようになります。●ダイナミックなどをRubyやPythonと知覚することができ、反射自分のしたもの。このオブジェクトのJavaの知覚できないかのように見えないミラーであるオブジェクトの反射ラックスオブジェクトはPythonと知覚することができないです。それがなぜ必要がありま反映Java.

ていただきたいと思い追加点すべてが掲載される。

反射API に書き込みユニバーサル toString() る方法、オブジェクトです。

便利ですのでデバッグしやすくなります。

ここでは一部の例:

class ObjectAnalyzer {

   private ArrayList<Object> visited = new ArrayList<Object>();

   /**
    * Converts an object to a string representation that lists all fields.
    * @param obj an object
    * @return a string with the object's class name and all field names and
    * values
    */
   public String toString(Object obj) {
      if (obj == null) return "null";
      if (visited.contains(obj)) return "...";
      visited.add(obj);
      Class cl = obj.getClass();
      if (cl == String.class) return (String) obj;
      if (cl.isArray()) {
         String r = cl.getComponentType() + "[]{";
         for (int i = 0; i < Array.getLength(obj); i++) {
            if (i > 0) r += ",";
            Object val = Array.get(obj, i);
            if (cl.getComponentType().isPrimitive()) r += val;
            else r += toString(val);
         }
         return r + "}";
      }

      String r = cl.getName();
      // inspect the fields of this class and all superclasses
      do {
         r += "[";
         Field[] fields = cl.getDeclaredFields();
         AccessibleObject.setAccessible(fields, true);
         // get the names and values of all fields
         for (Field f : fields) {
            if (!Modifier.isStatic(f.getModifiers())) {
               if (!r.endsWith("[")) r += ",";
               r += f.getName() + "=";
               try {
                  Class t = f.getType();
                  Object val = f.get(obj);
                  if (t.isPrimitive()) r += val;
                  else r += toString(val);
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         }
         r += "]";
         cl = cl.getSuperclass();
      } while (cl != null);

      return r;
   }    
}

からのjavaドキュメント ページ

java.lang.reflect パッケージのクラスとインタフェースを得るための反射に関する情報クラスとオブジェクト。反射トへのアクセスに関する情報の分野の手法やコンストラクタのドラの使用を反映分野の方法は、コンストラクタの操作の基本となる変数、セキュリティ上の制限か

AccessibleObject で抑制するアクセスかどうかをチェックします、必要な ReflectPermission が可能です。

授業ではこのパッケージには、 java.lang.Class 応用などのデバッガ、通訳者、オブジェクトの検査員は、クラスブラウザでは、サービスなど Object SerializationJavaBeans アクセスする必要があるいずれかのpublicメンバを対象オブジェクト(その実行時クラスの宣言されたメンバに指定されたクラスにより

で以下の機能。

  1. 取得のクラスオブジェクト
  2. 検討の特性をクラス分野のメソッド、コンストラクタ),
  3. 設定やフィールド値,
  4. 呼び出方法
  5. 新しいインスタンスをサポートします。

この 文書 リンクの方法によって明らかにされた一連の Class クラスです。

このことから (デニス-Sosnoski長Sosnoskiソフトウェア-ソリューション株式会社) (セキュリティ-探pdf):

きな欠点以上の反射

ユーザーの反射:

  1. で非常に汎用性の動的リンクプログラム部品
  2. これを図書館がオブジェクトは、一般的な方法

欠点の反射:

  1. 反射するよりもずっと遅いですが直接コードする場合の分野や方法。
  2. ででぼんの内部コード
  3. でfpgaのソースコードを作成できメンテナンスの問題
  4. 反射コードも複雑化に対応する直接コード
  5. この違反のJavaセキュリティ制限など としてデータアクセスの保護と安全タイプ

一般人権侵害:

  1. 負荷への持ち込みが禁止されている授業
  2. の取得を参照コンストラクタ、メソッドまたは領域に制限されたクラス
  3. 新しいオブジェクトの場合、方法は、呼び出しの取得または設定フィールドの値の制限されたクラスです。

このSEに関する質問に対する虐待の反射特徴:

いかりのprivateフィールドJava?

概要:

不安の機能から行うシステム内のコードでも容易に妥協のJavaセキュリティモードl. なのでこの機能を使用は控えめに

名前そのものの提案を反映しているという点からして何がで例えば、クラスメソッドなどのほから提供する機能を呼び出す方法を動的にインスタンスを行います。

そして多くのお客様に使用されてい枠組みの下に、アプリケーションの木材を呼び出すことなく、サービスの実際を知る。

Reflection 多くの 用途.ついに知り、作成できるコードができます。

IE:動的クラス、機能のコンストラクタに基づく任意のデータ xml/配列/sql結果/ハードコード/etc..)

反射また、柔軟性と使い勝手を重視する書がますます重要になっていく。す。イルを作成することに対してオブジェクト実行時に呼び出方法で行います。そのためのプログラム可能性の高いパラメータ化します。ことができますintrospectingのオブジェクトのクラスを検出し、その変数の方法に晒される外側の世界です。

たいこのような疑問に答えるためによります。まず Hibernate プロジェクト Reflection APICRUD 諸橋の間にある溝はアプリケーションの実行を継続す。どうにもならない場合のドメイン、 Hibernate は知って持続し、データストアを開きます。

また作品 Lombok Project.それだけで混コードをコンパイル時に、コードを挿入することができます。(だめsetterか、セッター)

Hibernate 選んだ reflection のでは影響が最小の構築プロセスです。

からJava7を MethodHandles, の働きをする Reflection API.プロジェクト、ロガーまでをコピー-ペーストは次のコード:

Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());

のではない商品につけられたタエラー。

てを見たいので説明する例にお答えいいのに---

実際の使用例反射するには、Java言語サーバーのJavaやPHP言語サーバー書PHP等言語サーバーが引き出せるようにすることIDE能力のように自動補完、涙の定義にコンテキスト、統一種です。するためにすべてのタグの名前(できる単語のautocompleted)マッチを押すと、例えば、 タブ 、出典が"カンター-ジャパン"のヒントを言語サーバの検査すべてのサンディエゴのクラスを含むそのdocフレーバブロックおよび個人会員とする。そのニーズを反映したクラスです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top