2.詳細クラスローダに説明します
3.シンプルなホットデプロイを達成するために
1.ホット・デプロイとは何ですか
熱い展開はどのようなものです:Java仮想マシンを再起動しなくても自動的に変更クラスファイルと更新クラス実行時の動作を検出し、
詳細クラスローダに説明2.
クラスローダの役割:
1.クラスがJVMにロードされるロードする責任がある2.レビュー各クラス
3.クラスのバイトコードオブジェクトのJVM均一なフォーマットの要件を再解析
クラスローダカテゴリー:
1.クラスローダ
2.拡張クラスローダ
3.システムクラスローダ
4.カスタムローダー
クラスのロード処理:
.classファイルは、植物に、JVMに原料をロード
これらのクラスファイルをロードする方法仮想マシン?
ローディングの.classの.class仕様は、JVMかどうかを確認 - >調製:静的クラス変数にメモリを割り当て、初期化デフォルト - >分析 - >初期化:静的クラス変数の正しい値で
ローディング機構クラスローダ:
ブートクラスローダ:ブートストラップclasscloaderの
効果:ロードJavaのコアライブラリ
拡張クラスローダ:内線のクラスローダの
効果:ロードJDKHOME / libに/ extに拡張機能パッケージとカスタム追加することができます:-Dのjava.ext.dirs = extディレクトリ指定された
アプリケーション・ローダ(システムクラスローダ):アプリケーションのクラスローダの
効果:ディレクトリまたはjarパッケージのJavaクラスパスにクラスをロードするための責任
(Nを有していてもよい)カスタムローダー:継承はjava.lang.ClassLoader
親委譲モデル:息子が父を見つけ、彼の父親探しの祖父
アプリケーションローダアプリケーションクラスローダ - >拡張クラスローダーのExtクラスローダ - >スタートクラスローダbootstarpクラスローダブートローダーがクラスを見つけることができない場合:スタートクラスローダ - >拡張クラスローダ - >アプリケーションローダ層の層が戻ります
カスタムjava.lang.Stringでは印刷できませんか?
java.langのパッケージ;
パブリッククラスの文字列{
パブリック静的無効メイン(文字列[] args){
するSystem.out.println(「ハローワールド」);
}
}
最初のローダを見つける1レベル上にロードされ、印刷することができません、見つかったスタートクラスローダJavaのコアクラスは、クラスを持っている場合、その実行が実行されている場合、コアクラス文字列が間違ってレポートの主な方法、Stringクラスのコアではないされていることが分かります。
スレッドの例外「メイン」java.lang.NoSuchMethodException:java.lang.String.main([Ljava.lang.String;)なぜ実行しないが、ロードされたトップクラスでそれを見つけます
親委任モデルの利点:
1.セキュリティ:保護コアJavaクラスをカバーすることはできません
2.ユニティ:優先順位で
Javaクラスの完全修飾名のみのために必要使用するカスタムクラスローダ、一度にロードすることができます:JVMは二つの同じクラスかどうかを決定する方法
1. 2つの完全修飾クラス名の名前の分析が等しい+です
負荷へのクラスローダの同じ実施形態かどうかを決定する2
3.シンプルなホットデプロイを達成するために
/ **
* YZ ON 2018年2月7日によって作成されます。
*カスタムクラスローダ
* /
publicクラスのMyClassLoaderは、ClassLoaderを拡張{
/ **
* +オーバーライド継承されたメソッドを挿入Altキー
* @param名:パッケージ名+クラス名パス
* @return
*は、ClassNotFoundExceptionが@throws
* /
@Overrideは
クラス<?>にfindClass(文字列名)はClassNotFoundExceptionが{スロー保護された
ファイルに// Javaクラスファイルに渡された変換
」(文字列fileNameに= name.substring(name.lastIndexOfを 。 。 ")+ +1)+"クラス「;
。this.getClass入力ストリームIS =()getResourceAsStream(filename)で、
試し{
バイト[] =新しい新しいバイトB [is.available()];
is.read(B)。
defineClass(名前、B、0、てb.length)を返します。
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}最後に{
場合(!ある= NULL){
試み{
is.close();
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}
}
}
super.findClass(名前)を返します。
}
}
/ **
* 2018年2月7日にYZによって作成されました。* /
publicクラスHelloService {
公共空のsayHello(){
System.out.printlnは( "我是Hello Worldのバージョン2");
}
}
/ **
* YZ ON 2018年2月7日によって作成されます。
*テストの原則ホットデプロイ
* /
アプリケーション{publicクラス
のpublic static無効メイン(文字列[] args)は例外{スロー
loadHeloを();
//動的なクラス置き換える
にSystem.gcを(); //現在のクラスファイルのJVMを解放するので、解放するために、実行中にロードになるため、占有
(1000)のThread.sleepを。
ファイル=にnewFile新しい新しいFile( "C:\\ \\デスクトップYZユーザー\\ \\ \\ NioDemo HelloService.class hostwap-デモ\\");
newFile.renameTo(旧); //新しいです古い文書ファイル交換
loadHeloを(); //再読み込み
}
/ **
*カスタムクラスローダ使用して
例外* @throws
* /
パブリック静的な無効loadHelo()が例外{スロー
MyClassLoader新しい新しいMyClassLoaderローダーを=();
クラスを< ?> = clazz loader.findClass( "com.yz.hostwap.demo.HelloService");
//反射的により
オブジェクト= clazz.newInstanceオブジェクト()
メソッド、メソッドclazz.getMethod =( "のsayHello");
方法。呼び出し(オブジェクト)。
System.out.println(object.getClass()+」「+ object.getClass()のgetClassLoader()。)。
}
}
ホットデプロイ原理が適用されます。
TomcatのJSP加载:org.apache.jasper.servlet.JasperLoader