ホームページ >Java >&#&チュートリアル >Javaリフレクション実装方法の原理を詳しく解説
この記事では主に Java メソッドのリフレクションの実装原理を詳しく紹介します。興味のある方は参考にしてください
ブロガーは次のように述べています: Java リフレクション メカニズムはすべてを知ることができます。このクラスのプロパティとメソッド、任意のオブジェクトに対して、そのメソッドとプロパティのいずれかを呼び出すことができます。情報を動的に取得し、オブジェクトのメソッドを動的に呼び出すこの機能は、Java 言語のリフレクション メカニズムと呼ばれます。この記事では、Zhan Xiaolang が Java リフレクション メカニズムの実装原理 (ソース コード) を分析しています。興味のある学生は、この記事を数分間読んで理解することができます。
Text
public class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Proxy(); Method method = Proxy.class.Javaリフレクション実装方法の原理を詳しく解説("run"); method.invoke(target); } static class Proxy { public void run() { System.out.println("run"); } } }Javaのリフレクションメカニズムを通じて、この方法で大量の呼び出しが行われると、オブジェクトの任意のメソッドを呼び出すことができます。パフォーマンスやメモリのリスクは何ですか?メソッドのリフレクション メカニズムを完全に理解するには、基礎となるコードから始めるしかありません。
Method Get
Class クラスの Javaリフレクション実装方法の原理を詳しく解説 を呼び出し、指定されたメソッド名とパラメータを持つメソッド オブジェクト Method を取得します。Javaリフレクション実装方法の原理を詳しく解説
Javaリフレクション実装方法の原理を詳しく解説
メソッドです。 Method.copy()
Javaリフレクション実装方法の原理を詳しく解説
クラスで宣言されたメソッドのリストをキャッシュまたはJavaリフレクション実装方法の原理を詳しく解説から取得します。実装は次のとおりです。Method 呼び出し
指定されたメソッド オブジェクト Method を取得した後、その invoke メソッドを呼び出すことができます。 invoke 実装は次のとおりです。
ここでの MethodAccessor オブジェクトが実装のキーであることに注意してください。最初は、メソッドAccessorは空です。新しいMethodAccessorオブジェクトを生成するには、メソッドAccessor自体が次のように実装されます。 MethodAccessor インターフェイスを実装します。実装は、ReflectionFactory クラスの newMethodAccessor を通じて作成されます。
ReflectionFactory クラスには、noInflation (デフォルト false) と inflationThreshold (デフォルト 15) という 2 つの重要なフィールドがあります。checkInitted メソッドでは、-Dsun.reflect.inflationThreshold=xxx および -Dsun.reflect.noInflation=true を渡すことができます。この 2 つのフィールドはリセットされ、一度だけ設定されます。noInflation が false の場合、newMethodAccessor メソッドは Javaリフレクション実装方法の原理を詳しく解説 のクラス実装を返します。実際、Javaリフレクション実装方法の原理を詳しく解説 オブジェクトはプロキシ オブジェクトです。プロキシ オブジェクトのデリゲートを呼び出すための invoke メソッド。デリゲート パラメーターは現在 NativeMethodAccessorImpl オブジェクトであるため、最後の Method の invoke メソッドは、次のように実装される NativeMethodAccessorImpl オブジェクトの invoke メソッドを呼び出します。ここではReflectionFactoryクラスを使用します。 デリゲートがinvokeメソッドを15回呼び出した場合 以降、呼び出しを続けると、MethodAccessorGeneratorクラスのgenerateMethodメソッドを通じてMethodAccessorImplオブジェクトが生成され、デリゲートオブジェクトとして設定されます。 Method.invoke が実行されると、新しく作成された MethodAccessor オブジェクトの invoke() メソッドが呼び出されます。ここで注意する必要があるのは、generateMethod メソッドが MethodAccessorImpl オブジェクトを生成するときに、対応するバイトコードをメモリ内に生成し、ClassDefiner.defineClass を呼び出して対応する Class オブジェクトを作成するということです。実装は次のとおりです。 ClassDefiner.defineClass メソッドでは、呼び出されるたびに DelegatingClassLoader クラス ローダー オブジェクトが生成されます。
パフォーマンスを考慮して毎回新しいクラス ローダーが生成されます。場合によっては、これらの生成されたクラスがアンロードされる可能性があります。クラスのアンロードは、クラス ローダーがリサイクルできる場合にのみリサイクルされます。元のクラス ローダーが使用されている場合、これらの新しく作成されたクラスがアンロードされなくなる可能性があります。設計上、これらのクラスが常にメモリ内に存在することは望ましくありません。そして必要なときにそこにいてください!
以上がJavaリフレクション実装方法の原理を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。