ホームページ  >  記事  >  Java  >  Javaベースのリフレクション

Javaベースのリフレクション

yulia
yuliaオリジナル
2018-09-10 16:33:591089ブラウズ

クラスオブジェクトを作成するには? 2 つの方法があります:
class.forName("class name");
Class a = a.class;
2 つの違いは次のとおりです: forName() は静的変数の初期化に役立ちます。静的変数を自分で初期化する必要があります。リフレクションを通じて、クラスをオブジェクトに変更するメソッドを実装できます。あるクラスは別の A クラスに属し、下方変換時の判定に使用されます。

クラス オブジェクトを通じて、次の情報を取得できます。 :

class.getConstructors(); すべてのコンストラクターを取得します。 class.getConstructor(null); これらのメソッドは、コンストラクター con を返します。コンストラクター; オブジェクトは con.newInstance("parameters"); を通じて作成できます。
class.getFields(); すべてのフィールドを取得します。 class.getField("name"); 特定のパブリック固有フィールド (name) を取得します。
set を使用してメンバー変数を設定します。 set(obj, "Andy Lau"); このうち、obj はクラスによって生成されたオブジェクトです。

class のすべての public メソッドを取得します。 ; すべてのメソッドを取得します;
class.getMethod("メソッド名", String.class); 次の String.class はメソッド オブジェクトを返します。フィールドと同様に、最初にオブジェクトを生成します。この場合、メソッド実行関数 invoke () を使用します。obj はオブジェクト、20 は main() を直接反映することもできます。メソッド; class.getMethod("main", Stirng[].class); リフレクションを通じて、それを元のベースで実装し、リフレクションを実装するためにプロパティを読み取り、新しいクラスを作成し、一般的なチェックを回避するためにメソッドを実行します。特定のコンテナのクラス ファイルを呼び出して、そのメソッドを呼び出して一般的なチェックを回避することもできます。
さらに、リフレクションを通じて動的プロキシ モードを実装することもできます。

interface Subject{
    public void doSomething();
}
class RealSubject implements Subject{
    public void doSomething(){
        System.out.println("call doSomething()");    
    }
}
class ProxyHandler implements InvocationHandler{
    private Object tar;
    public Object bind(Object tar){
       this.tar = tar;
       return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                                      tar.getClass().getInterfaces(),
                                      this);
     }
     public Object invoke(Object proxy, Method method ,Object[] args) throws Throwable{
         Object result = null;
        result = method.invoke(tar,args);
        return result;
    }
}
public class Test
{
    public static void main(String[] args[]){
        ProxyHandler proxy = new ProxyHandler();
        Subject sub = (Subject) proxy.bind(new RealSubject());
        sub.doSomething();
    }
}

を実装する ProxyHandler が使用されます。 InvocationHandler インターフェイスを使用し、実際のオブジェクトを渡すことによってプロキシ オブジェクトを取得します。パラメータは次のとおりです。 tar.getClass().getClassLoader() は実際のオブジェクトのクラス ローダー、tar.getClass().getInterfaces() は実際のオブジェクトのインターフェイスです。オブジェクト、およびこの InvocationHandler 自体は、リフレクション メカニズムを通じてプロキシ オブジェクトを取得します。同時に、このプロキシ オブジェクトのメソッド実行関数に、実行用の実際のオブジェクトを記述します。後続のメソッド呼び出しで最初に実際のオブジェクトのメソッドを呼び出すには、プロキシ オブジェクトのバインドを呼び出すときにオブジェクトを実際のオブジェクトに変換することを忘れないでください。

以上がJavaベースのリフレクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。