1.反射性能上の問題(セキュリティチェック)
1.1setAccessible
セキュリティチェック・アクセス・スイッチを有効化および無効化は真であり、それは、オブジェクトがJava言語アクセスチェックの実装に反映されるべきであることを示し、値がfalseで、オブジェクトは、Java言語アクセスチェックが廃止されるべきでの使用に反映されていることを示しています。
1.テストアン通常の呼び出し10億回、それは2258ms程度かかります。
2.テスト第二には、一般的な反射が10億回を呼び出す呼び出し、通常の通話の約30倍の速さ、およそ62kmsが必要です。(これは反射欠点です)
3.テストIIIはセキュリティチェックを介して提供され、その後、約4倍の速度、約10キロ増加しました。
一般的な操作反映
2.動作の一般的な反射
2.1はじめに
- Javaはジェネリック医薬品の導入を消去するために、一般的なメカニズムを使用して、Javaのジェネリックコンパイラのjavacは、変換のみを反映して、トラブルを避けるために、データのセキュリティを確保するために使用されます。しかし、一度コンパイルし、すべてのすべてが消去ジェネリック型に関連します。
- バスレフタイプ、筋金入りの実際のニーズを介して動作させるために、Javaはクラスタイプにマージすることができない表現するためには、ParameterizedType、GenericArrayType、TypeVariableとWildcardTypeの種類を追加しましたが、それは元の型とパータイプです。
- 例えばColloectionとしてParaneterizedTypeパラメータ化された型、<文字列>
- GenericArrayTypeパラメータタイプまたは可変配列
- 変数の様々なタイプのための公共TypeVariable親インターフェース
- などWildcardTypeワイルドカードの一般的な表現は、?、?番号,?スーパー整数を拡張します
公共 のボイド TEST01(地図<整数、文字列>マップ、リスト<ユーザ> リスト){ システム。アウト .println(" AA " ); }
パブリック 静的 ボイドプリント()がないNoSuchMethodException {スロー メソッドm = A.のクラス .getMethod(" TEST01 "、マップクラス。、リストクラス)。 タイプ[] T = m.getGenericParameterTypes()。 以下のために(タイプT 1:T){ タイプ[] genericTypes = ((は、ParameterizedType)T1).getActualTypeArguments(); 用{(genericTypesタイプTY) システム。アウト.println(TY)。 } } }
3.動的コンパイル
3.1はじめに
動的コンパイル機構のJava6.0導入
3.2。動的コンパイルのシナリオ
- アップロードするには、サーバーをコンパイルして実行するためのJavaコードブラウザ、オンライン評価システムを書きます
- サーバーのロード・ファイルを動的にコンパイル
3.3。二つのアプローチをコンパイル
- javacのを呼び出すことによって実行時、新しいプロセスの動作ダイナミックを開始する(コンテンツをコンパイルした後に実行)
ランタイム実行= Runtime.getRuntime(); プロセス処理 = run.exec(" Javaの-cpのD:/ myjava / HelloWorld.java ")。
- JavaCompile動的コンパイルにより、
パブリック 静的 INT compileFile(文字列SOURCEFILE){ JavaCompilerコンパイラ = ToolProvider.getSystem.JavaCompiler()。 int型の結果= compiler.run(NULL、NULL、NULL 、SOURCEFILE)。 システム。アウト .println(結果== 0?" 编译成功":" 编译失败" ); 戻り値の結果; }
プログラムの動的コンパイラ3.4を実行した後。
- 入力ストリーム(3.3.1)を得ることができる3.4.1.process、結果を印刷することができる値BufferdedRead
- 3.4.2。クラスをロードするクラスローダ、実行される方法を取得します
4.スクリプトエンジンでは、JavaScriptコードを実行します
4.1 ScriptEngineManager
ScriptEngineManager SEM = 新しいScriptEngineManager(); たScriptEngineエンジン = sem.getEngineByName(" ジャバスクリプト" )。 engint.put(" MSG "、" 良い人" )。 engine.eval(" 计算");
5.javaassistライブラリの紹介
5.1はじめに
- バイトコード操作を行うことができます
5.2。操作を実行するバイトコードを達成することができます
- 動的に新しいクラスを生成します
- 動的クラスの構造を変更します
5.3。メリット
- 反射オーバーヘッドよりも小さく、高性能
5.4一般的なバイトコード操作ライブラリ
- バエル
Apache Software FoundationのJakartaプロジェクトの一部であるバイトコードエンジニアリングライブラリは、BCELが使用するJava Classworkingバナジウム鋼のためのフレームワークである、それはあなたのJVMアセンブリ言語のクラスの操作への洞察を与えることができ、BCELとJavaassistはバイトを処理するさまざまな方法があります、BCEL実際のJVM指示操作BCELは、JVM命令サポートコンパイラソースコードレベルのタスクの富を有します
- ASM
軽量フレームワークJavaバイトコード、JVM根本的な直接注入操作と命令を操作します
- CGLIB(コード生成ライブラリ)
パワフル、高性能、高品質のコード生成ライブラリベースのASMは達成します
- Jwassist
Javaバイトコードコンパイラとライブラリを作成し、ASM比較的パフォーマンスの低下、ほとんどCGLIBを持つが、使用するのは簡単、適用可能な多くのオープンソースのフレームワーク