この記事では主に 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"); } } }
Method Get
Class クラスの Javaリフレクション実装方法の原理を詳しく解説 を呼び出し、指定されたメソッド名とパラメータを持つメソッド オブジェクト Method を取得します。Javaリフレクション実装方法の原理を詳しく解説
Javaリフレクション実装方法の原理を詳しく解説 メソッドは、キャッシュまたは Javaリフレクション実装方法の原理を詳しく解説 からクラスで宣言されたメソッドのリストを取得し、Javaリフレクション実装方法の原理を詳しく解説 メソッドは、返されたメソッド リストから名前とパラメーターに一致するメソッド オブジェクトを見つけます。Javaリフレクション実装方法の原理を詳しく解説
一致するメソッドが見つかった場合、新しいコピーが返されます。これが メソッドです。 Method.copy()
Javaリフレクション実装方法の原理を詳しく解説
クラスで宣言されたメソッドのリストをキャッシュまたはJavaリフレクション実装方法の原理を詳しく解説から取得します。実装は次のとおりです。 Javaリフレクション実装方法の原理を詳しく解説()メソッドは次のように実装されます。さらに重要なデータ構造 ReflectionData は、Javaリフレクション実装方法の原理を詳しく解説 から読み取られたクラスの次の属性データをキャッシュするために使用されます: ReflectionData() メソッドの実装から、Javaリフレクション実装方法の原理を詳しく解説 オブジェクトは SoftReference タイプであることがわかります。メモリが不足している場合はリサイクルされる可能性がありますが、-XX:SoftRefLRUPolicyMSPerMB パラメータを使用してリサイクルのタイミングを制御することもできます。Javaリフレクション実装方法の原理を詳しく解説 がリサイクルされ、リフレクション メソッドが有効になっている限り、リサイクルされます。 Javaリフレクション実装方法の原理を詳しく解説 メソッドを使用してのみ、そのようなオブジェクトを再作成できます。 Javaリフレクション実装方法の原理を詳しく解説 メソッドは次のように実装します。 Javaリフレクション実装方法の原理を詳しく解説() が空ではありません。ReflectionData オブジェクトから宣言メソッド プロパティを取得してみます。初めての場合、または GC によるリサイクル後の場合、再初期化されたクラス属性は空です。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 サイトの他の関連記事を参照してください。