著者:小福兄の
ブログ:https://bugstack.cn
あなたと他の人が何かを手に入れることができるように、入金、共有、そして成長してください!
1.はじめに
上記2つのでjavassist
基本的なコンテンツ、一般導入;細胞型(ClassPool)、クラス(CtClass)、属性(CtField)、方法(CtMethod)、使用時に、パラメトリックメソッドにパラメータの異なるタイプを作成することによって、基本的にこのコード構造をバイトコードプログラミングに使用する方法を習得できます。
さて、今日は使用しようとするjavassist
クラスの内部に実装されている方法の内容を変更します。つまり、クラス情報は実行時に再ロードされます
それはあなたの通常であってもよいCRUDで、このような発展を期待していなかったバーン運転が、それは、使用中のシナリオをたくさん持っている、例えば、
- ホットデプロイメントは、主にそのようなシステムが頻繁に起動および停止できず、長時間かかるアプリケーションを起動できないため、本番環境で一般的に使用されます。
- 他のコンポーネント化されたリスク管理モデルパッケージは、外部で使用するためのものです。モデルパッケージがアップグレードされた場合、外部の再デプロイメントは不要であり、アップグレードを通知する必要もありません。
- さらに、それは開発とデバッグに使用され、コーディング効率を効果的に改善し、コードファーマーの右手と左手を解放できます。
人間の脳は未知のものを作ることは難しいので、学ぶ必要があります。Brother FuのコードとCRUDを少なくしてください
関係するすべてのコードをプログラミングするバイトについて、に着目して缶公众号
:bugstackワームホールスタック、再:ソースコードは、取得されました。
第二に、開発環境
- JDK 1.8.0
- jdk1.8.0_161 \ libに\ tools.jarを-使用する必要
jdi
パッケージを - javassist 3.12.1.GA
3.ケースの目的
ケースより多くのゴールを作るために色彩
、我々は、シミュレート感謝航空機の妻は、システムを通して彼女のボーイフレンドは、照会危機のプロセスが緊急治療を必要とする、方法を。前女友数量
家族の調和を守り、危機を解決するために、クラスを動的にリロードし、謝の元ガールフレンドの数を変更し0
て戻ってきました。次に、家族の調和を解決します。結局、飛行機に感謝することは報酬として私にお金を与えるでしょう
謝平面をパニックにする方法
public class ApiTest {
public String queryGirlfriendCount(String boyfriendName) {
return boyfriendName + "的前女友数量:" + (new Random().nextInt(10) + 1) + " 个";
}
}
予測可能な結果 ;
你到底几个前女友!!!
谢飞机的前女友数量:3 个
谢飞机的前女友数量:5 个
谢飞机的前女友数量:8 个
4.技術の実現
1. HotSwapperオペレーションクラスのホットロード
ドラフトユニオン、エースエンジニア、申請栈
/**
* 公众号:bugstack虫洞栈
* 博客栈:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 本专栏是小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果能为您提供帮助,请给予支持(关注、点赞、分享)!
*/
public class GenerateClazzMethod {
public static void main(String[] args) throws Exception {
ApiTest apiTest = new ApiTest();
System.out.println("你到底几个前女友!!!");
// 模拟谢飞机老婆一顿查询
new Thread(() -> {
while (true){
System.out.println(apiTest.queryGirlfriendCount("谢飞机"));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 监听 8000 端口,在启动参数里设置
// java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
HotSwapper hs = new HotSwapper(8000);
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(ApiTest.class.getName());
// 获取方法
CtMethod ctMethod = ctClass.getDeclaredMethod("queryGirlfriendCount");
// 重写方法
ctMethod.setBody("{ return $1 + \"的前女友数量:\" + (0L) + \" 个\"; }");
// 加载新的类
System.out.println(":: 执行HotSwapper热插拔,修改谢飞机前女友数量为0个!");
hs.reload(ApiTest.class.getName(), ctClass.toBytecode());
}
}
2.知識ポイント
- マルチスレッドのシミュレーションループ呼び出し。このメソッドは常にクエリを実行します。クラスのその後の変更後、出力情報は異なります。
javassist.tools.HotSwapper
それはjavassist
ロード操作に提供される熱パックの交換クラス。実行中は、JPDA(Java Platform Debugger Architecture)を有効にする必要があります。ctMethod.setBody
書き換え方法の内容は、上記の2つの章で明確に説明されています。$ 1は取得メソッドの最初の入力パラメーターであり、中括弧{}
は置換メソッドの本体です。- 最後に、の使用
hs.reload
行う交換作業の熱負荷、ctClass.toBytecode()
取得した後処理バイトコードクラス。
V.テスト結果
1. tools.jarを導入する
2.pèizhì-agentlib
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
3.テストを実行する
Listening for transport dt_socket at address: 8000
你到底几个前女友!!!
谢飞机的前女友数量:3 个
谢飞机的前女友数量:5 个
谢飞机的前女友数量:8 个
:: 执行HotSwapper热插拔,修改谢飞机前女友数量为0个!
谢飞机的前女友数量:4 个
谢飞机的前女友数量:5 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
谢飞机的前女友数量:0 个
...
Process finished with exit code -1
元ガールフレンドの数が0であることを確認したとき、Xie Aircraftは恥ずかしそうに笑い、エースエンジニアに4セントを与えるという彼の約束を果たしました小傅哥
。
4.効果のデモンストレーション
6.まとめ
- まさか、どんなに優れたテクニックであっても、誰もそれを見ることはないでしょう。弟の飛行機にのみ穴をあけることができます!ドラフトユニオン、エースエンジニア、申請
栈
- 実際のシーンでのクラスのホットロードと変更に関する操作は非常にたくさんありますが、一般的にはより厳しいシーンです。これは通常の開発では比較的まれであり、CRUD開発は発生しません。
Javassist
以下の場合ASM
、この操作コードバイト一緒にパッケージを提供するためにAPI
いくつかのシナリオではない考慮する必要があり、本当に良い操作JVM
ローカル変数とオペランドスタックを。ただし、より高いパフォーマンスが必要な場合は、その使用を検討できますASM
。