Javaリフレクションの使用効率を向上させる方法
私たちは日々の仕事やインタビューなどで「リフレクション」という知識ポイントに出会うことがあります。「リフレクション」によってオブジェクトの情報を動的に取得したり、オブジェクトのメソッドなどを柔軟に呼び出すことができると同時に、それを利用することになります。別の音、つまり「反射」の出現は非常に遅いため、使用は控えめにする必要があります。反映は本当に遅いですか?通常、オブジェクトを作成してメソッドを呼び出すときと比べて、どれくらい遅いのでしょうか? 多くの人はテストしたことがなく、単に「聞いた」だけだと思います。いくつかのテストケースを通して、「振り返り」を直接体験してみましょう。
Text
テスト オブジェクトの準備
以下では、id 属性と name 属性、およびその getter/setter メソッドのみを持つテスト クラス TestUser を定義します。 a self-sayHi メソッドを定義します。
public class TestUser { private Integer id; private String name; public String sayHi(){ return "hi"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
100 万個のオブジェクトを作成するテスト
// 通过普通方式创建TestUser对象@Testpublic void testCommon(){ long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){ ++i; user = new TestUser(); } long end = System.currentTimeMillis(); System.out.println("普通对象创建耗时:"+(end - start ) + "ms"); }//普通对象创建耗时:10ms
// 通过反射方式创建TestUser对象@Testpublic void testReflexNoCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){ ++i; user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance(); } long end = System.currentTimeMillis(); System.out.println("无缓存反射创建对象耗时:"+(end - start ) + "ms"); }//无缓存反射创建对象耗时:926ms
上記の 2 つのテスト方法で、作成者はそれぞれ 5 回テストし、消費した時間を平均して出力しました。結果として、1 つは 10 ミリ秒、もう 1 つは 926 ミリ秒となり、100 万個のオブジェクトが作成されると、実際には反射は約 90 倍遅くなります。なんと?ギャップはそんなに大きいですか?反映は本当に遅いですか?次に、著者は反省姿勢を変えてテストを続け、結果はどうなるか?
// 通过缓存反射方式创建TestUser对象@Testpublic void testReflexWithCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; Class rUserClass = Class.forName("RefleDemo.TestUser"); int i = 0; while(i<1000000){ ++i; user = (TestUser) rUserClass.newInstance(); } long end = System.currentTimeMillis(); System.out.println("通过缓存反射创建对象耗时:"+(end - start ) + "ms"); }//通过缓存反射创建对象耗时:41ms
実際、コードを通して、Class.forName メソッドの方が時間がかかることがわかります。実際には、このメソッドはローカル メソッドを呼び出し、JVM はこのメソッドを通じて、指定されたクラスを検索してロードするように求められます。そのため、プロジェクト内で使用する場合は、Class.forName で返された Class オブジェクトをキャッシュしておき、次回使用するときにキャッシュから直接取得できるため、Class の取得効率が大幅に向上します。同様に、コンストラクター、メソッド、その他のオブジェクトを取得するときに、それらを使用するためにキャッシュして、使用するたびに時間のかかる作成を避けることもできます。
リフレクション呼び出しメソッドのテスト
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){ ++i; method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("反射调用方法耗时:"+(end - start ) + "ms"); }//反射调用方法耗时:330ms
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){ ++i; method.setAccessible(true); method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("setAccessible=true 反射调用方法耗时:"+(end - start ) + "ms"); }//setAccessible=true 反射调用方法耗时:188ms
ここでは、sayHi メソッドを 1 億回リフレクトして呼び出します。method.setAccessible(true) を呼び出した後、半分近く高速になっていることがわかりました。 API を見ると、取得フィールドの設定時やメソッドの呼び出し時に jdk がセキュリティ アクセス チェックを実行することがわかりますが、そのような操作には時間がかかるため、 setAccessible(true) を通じてセキュリティ チェックをオフにすることができます。反射効率が向上します。
究極のリフレクション
上記の方法に加えて、リフレクションを極限まで活用する方法はあるでしょうか?ここでは、高性能リフレクション ツールキットである ReflectASM を紹介します。バイトコード生成により実装されたリフレクション機構で、Java リフレクションとの性能比較は以下の通りです。
結論
最後にまとめると、リフレクションをより効果的に使用するには、プロジェクトの開始時にリフレクションに必要な関連構成とデータをメモリにロードする必要があります各ステージは、リフレクション操作のためにキャッシュからこれらのメタデータをフェッチします。リフレクションを恐れる必要はありません。仮想マシンは常に最適化されています。適切な方法を使用している限り、「噂」ほど遅くはありません。パフォーマンスを究極に追求する場合、次のことを考慮できます。サードパーティのパッケージを使用してコードを直接操作します。
関連チュートリアル: Java ビデオ チュートリアル
以上がJavaリフレクションの使用効率を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









DeepMind の AI エージェントが再び稼働します。注目してください、BBF という名前のこの男は、わずか 2 時間で 26 個の Atari ゲームをマスターしました。彼の効率は人間と同等であり、すべての先任者を上回っています。ご存知のとおり、AI エージェントは強化学習を通じて問題を解決するのに常に効果的ですが、最大の問題は、この方法が非常に非効率で、探索に長い時間がかかることです。画像 BBF によってもたらされた画期的な進歩は、効率の点にあります。フルネームが Bigger、Better、Faster と呼ばれるのも不思議ではありません。さらに、トレーニングは 1 枚のカードだけで完了でき、必要な計算能力も大幅に削減されます。 BBF は Google DeepMind とモントリオール大学によって共同提案され、データとコードは現在オープンソースです。到達可能な最高の人間

PyCharm は、コードの作成、デバッグ、プロジェクト管理のために Python 開発者によって広く使用されている強力な Python 統合開発環境 (IDE) です。実際の開発プロセスでは、ほとんどの開発者は、開発効率を向上させる方法、チームメンバーと開発にどのように協力するかなど、さまざまな問題に直面します。この記事では、開発者がリモート開発で PyCharm をより効果的に使用し、作業効率を向上させるのに役立つ、PyCharm のリモート開発の実践的なガイドを紹介します。 1. PyChでの準備作業

StableDiffusion はオープンソースの深層学習モデルで、主な機能はテキスト記述を通じて高品質な画像を生成することであり、グラフ生成、モデルの結合、モデルのトレーニングなどの機能をサポートしています。このモデルの操作インターフェイスは次の図に示されています。画像の生成方法. 以下は、水を飲む鹿の画像を作成するプロセスの紹介です. 画像を生成する際には、プロンプトワードとネガティブプロンプトワードに分けられます. プロンプトワードを入力する際には、それを説明する必要があります希望するシーン、オブジェクト、スタイル、色を明確に説明してください。たとえば、単に「鹿が水を飲む」と言うのではなく、「小川があり、鬱蒼とした木の隣にあり、その小川の隣に鹿が水を飲んでいます」と言うと、否定的なプロンプトの言葉が逆の方向になります。例:建物も人も橋も柵もありません。また、説明が曖昧すぎると不正確な結果が生じる可能性があります。

Java リフレクションは、クラスのプライベート フィールドやメソッドにアクセスできるようにする強力なツールであり、それによってソフトウェアの内部動作を明らかにします。これは、リバース エンジニアリング、ソフトウェア分析、デバッグなどの分野で役立ちます。 Java リフレクションを使用するには、まず java.lang.reflect パッケージをインポートする必要があります。次に、 Class.forName() メソッドを使用して、クラスの Class オブジェクトを取得できます。 Class オブジェクトを取得すると、さまざまなメソッドを使用してクラスのフィールドやメソッドにアクセスできます。たとえば、getDeclaredFields() メソッドを使用すると、プライベート フィールドを含むクラスのすべてのフィールドを取得できます。 getDeclaredMethods() メソッドを使用することもできます。

インターネットの急速な発展に伴い、データベースの重要性がますます高まっています。私たちは Java 開発者としてデータベース操作に関わることが多く、データベース トランザクション処理の効率はシステム全体のパフォーマンスと安定性に直接関係します。この記事では、データベースのトランザクション処理効率を最適化し、開発者がシステムのパフォーマンスと応答速度を向上させるために Java 開発で一般的に使用されるいくつかのテクニックを紹介します。バッチ挿入/更新操作 通常、データベースに 1 つのレコードを一度に挿入または更新する効率は、バッチ操作の効率よりも大幅に低くなります。したがって、一括挿入/更新を実行する場合、

タイトル: Python は生活をより便利にします: この言語をマスターして仕事の効率と生活の質を向上させましょう 強力で学びやすいプログラミング言語として、Python は今日のデジタル時代にますます人気が高まっています。 Python は、プログラムを作成したりデータ分析を実行したりするためだけでなく、私たちの日常生活でも大きな役割を果たします。この言語をマスターすると、仕事の効率が向上するだけでなく、生活の質も向上します。この記事では、具体的なコード例を使用して、日常生活における Python の幅広い応用例を示し、読者の役に立つようにします。

sessionStorage の役割をマスターし、フロントエンド開発の効率を向上させるには、具体的なコード例が必要です インターネットの急速な発展に伴い、フロントエンド開発の現場も日々変化しています。フロントエンド開発を行う場合、多くの場合、大量のデータを処理し、後で使用するためにブラウザに保存する必要があります。 SessionStorage は、一時的なローカル ストレージ ソリューションを提供し、開発効率を向上させる非常に重要なフロントエンド開発ツールです。この記事ではsessionStorageの役割を紹介します。

サブネット マスクの役割とネットワーク通信効率への影響 はじめに: インターネットの普及により、ネットワーク通信は現代社会に不可欠な部分となっています。同時に、ネットワーク通信の効率化も注目されています。ネットワークの構築と管理のプロセスにおいて、サブネット マスクは重要かつ基本的な構成オプションであり、ネットワーク通信において重要な役割を果たします。この記事では、サブネットマスクの役割とネットワーク通信効率への影響について紹介します。 1. サブネットマスクの定義と機能 サブネットマスク(subnetmask)
