みなさん、こんにちは。氷河です~~
最近、たくさんの友達とおしゃべりをしていると、記事を読んでいるあなたや私も含めて、ほとんどの人が長い間働いていることがわかりました。3〜5年、さらには8年以上働いている友達もいます。
ただし、ほとんどの小規模なパートナーは通常、単純なCRUDで作業し、ビジネス開発や日常業務でのシステムバグの修正にうんざりしており、毎日遅くまで残業しています。技術力を向上させる時間はありませんが、時間の経過とともに、技術力と就業年数の間に深刻なミスマッチが生じます。
オフトピック
実際、これらの状況に応えて、多くの友人が私に何度も尋ねてきました。氷河、私のキャリアは非常に混乱していると感じています。アドバイスをいただけますか?私の勤務時間は短くありません。一日中CRUDの仕事をしていて、勉強する時間がありません。
正直なところ、インターネット業界では、多かれ少なかれ誰もがこの種の混乱を経験するでしょうし、私もそうです。この混乱を一瞬で解消するだけで、何がこの混乱を感じさせるのかを考えなければなりません。技術力ですか?ビジネスは理解していますか?対人コミュニケーションですか?それは職場のルールですか?等 。。
私は、実際の状況と組み合わせて混乱を招く可能性のあるこれらの要因の詳細な分析を行います。
- 技術力の欠如が私を混乱させた場合、私は私の技術力を向上させるために利用可能なすべての空き時間をつかみます。
- 会社の事業に対する理解不足が原因で混乱が生じた場合は、事業に対する理解を深め、理解を深め、推測し、繰り返し実演していきます。
- それが対人関係の問題による混乱の感覚であるならば、私は対人関係に対処する能力を強化します。
- 職場のルールに慣れていないことが原因で混乱が生じた場合は、個人的な職場の質を高めていきます。
- 混乱を引き起こす他の要因を排除します。
したがって、小さな友達が混乱していると感じることは重要ではありません。重要なのは、それが外的要因であるか内的要因であるかにかかわらず、あなたが混乱していると感じる要因を分析することです。混乱を招く要因を見つけたら、これらの問題を徐々に分解し、不足している特定のスキルを徐々に向上させます。このプロセスは長くなる場合があり、数日、数週間、または数か月かかる場合があります。これには、ステップダウンしてゆっくりと蓄積して蓄積する必要があります。
氷河はあなたに一文を与えたいと思います:忍耐力、忍耐力、そして毎日少しずつ進歩します。
そんなに多くのことを言ってきましたが、それは混乱の時期にある小さな友達へのちょっとした提案です。
さて、小さな友達が混乱した時期をできるだけ早く乗り越えるのを助けるために、Bingheはあなたをより技術的に助けたいと思っています。今日から、バイトコードプログラミングについての知識をあなたと共有します。これはあなたが取り組んできたものかもしれません。 .CRUDの作業はまったく触れられていません。
動的バイトコードテクノロジー
Javaを知っている人なら誰でも、Javaで記述したコードをJVMで実行する前にバイトコードにコンパイルする必要があり、バイトコードがJVMのメモリにロードされると、解釈して実行できることを知っています。Javaソースコードとコンパイルにより、対応するクラスファイルが生成されることがよくあります。実際、ファイルが変更できる限り、ファイルは多かれ少なかれ変更できます。
特定の技術を使用して特定のルールに従ってバイトコードファイルを変更したり、バイトコードの実行ロジックを再定義したり、独自のロジックを追加したりすると、元のコードの実行ロジックは変更されませんか?
元のバイトコードを変更するだけでなく、動的バイトコードテクノロジを使用して新しいクラスを動的に作成し、必要なビジネスロジックを完成させることもできます。
動的バイトコードの利点は、以前のソースコードを変更しないことです。プログラムがバイトコードを生成した後、生成されたバイトコードを変更したり、実行時に新しいクラスやメソッドを動的に生成したりすることで、侵入をゼロにすることができます。
バイトコードプログラミングを実装する方法
Javaの分野では、バイトコードを動的に変更できるテクノロジーが数多くあります。ASM、Javassist、Bute-buddyの3つの人気のあるテクノロジーがあります。
- ASM:バイトコードを直接操作する命令は実行がより効率的ですが、ユーザーはJavaバイトコードファイルの形式と命令を事前に習得する必要があり、ユーザーにとってより要求が厳しくなります。
- Javassist:高レベルのAPIを提供します。ASMと比較すると、実行効率は比較的低くなりますが、Javaバイトコードの形式や命令を理解する必要がなく、ユーザーの要件も比較的低くなります。
- Bute-buddy:高レベルのAPIを提供します。ASMと比較すると、実行効率は比較的低くなりますが、Javaバイトコードの形式や命令を理解する必要がなく、ユーザーの要件も比較的低くなります。
バイトコードプログラミングの使用シナリオ
ある日、あなたが机に座って虫を喜んでノックしていると想像してみてください。このとき、技術リーダーは、プログラムの実行中に、特定のクラスのメソッドの前後に追加するという要件を実装するように求めます。特定のビジネスコード、または特定のビジネスシナリオに従ってメソッドの実行ロジックを置き換えます。リーダーは特に注意しました。操作中の動的な変更に注意してください。作成者は侵入をゼロにする必要があり、ソースコードに基づいて変更しないでください。
この要件を聞いたとき、SpringのAOPプロキシテクノロジーについて考えるかもしれません。はい、SpringのAOPプロキシテクノロジーは確かにこの要件を達成できます。ただし、これを行うには、委任されたメソッドにアノテーションを追加し、元のコードを変更する必要がありますが、これは要件を満たしていません。さらに、SpringのAOPテクノロジを使用した場合のパフォーマンスは、バイトコードプログラミングのパフォーマンスよりも低くなります。
さらに、多くのオープンソースフレームワークも下部にバイトコードプログラミングテクノロジーを使用しています。たとえば、AliのオープンソースのDubbo、Arthasなど。
バイトコードプログラミングには、非常に重要なコアアプリケーションシナリオ(APM(アプリケーションパフォーマンス管理)の実装)もあります。後で、Glacierは、完全で使用可能なAPMシステムをすべての人に渡してもらいます。
入門
開発環境
- JDK 1.8
- IDEA 2018.03
完全なコード
Glacierは、この記事の完全なケースコードをGitHubとGiteeに提出し、現在、ケースの形で更新しています。その後、バイトコードプログラミングに基づいて使用可能なAPMシステムが実装されます。
GitHub:https://github.com/sunshinelyz/bytecode
Gitee:https://gitee.com/binghe001/bytecode
この記事に対応するケースコードは、bytecode-javassist-01です。記事が役に立ったら、GitHubとGiteeのスターをクリックしてください~~
ケース効果
premain()メソッドは、main()メソッドが実行される前に実行されます。
手
この導入事例では、最初にJavassistを使用して実装します。Mavenプロジェクトbytecode-javassist-01
を作成し、pom.xmlファイルにJavassist関連の依存関係を導入します。
<properties>
<javassist.version>3.20.0-GA</javassist.version>
</properties>
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>${javassist.version}</version>
</dependency>
</dependencies>
プロジェクトのビルディングブロックを追加し、プロジェクトのを指定しますPremain-Class
。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestEntries>
<Project-name>${project.name}</Project-name>
<Project-version>${project.version}</Project-version>
<Premain-Class>io.binghe.bytecode.javassist.test.Premain</Premain-Class>
<Boot-Class-Path>javassist-3.20.0-GA.jar</Boot-Class-Path>
<Can-Redefine-Classes>false</Can-Redefine-Classes>
</manifestEntries>
</archive>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
Mainクラスを作成します。
/**
* @author binghe (公众号:冰河技术)
* @version 1.0.0
* @description Javassist的第一个测试程序
*/
public class Main {
public static void main(String[] args){
System.out.println("hello main");
}
}
Premainクラスを作成します。
/**
* @author binghe (公众号:冰河技术)
* @version 1.0.0
* @description 第一个pemain程序,在main方法前面执行
*/
public class Premain {
public static void premain(String args){
System.out.println("hello premain");
}
}
これを見て、多くの小さなパートナーが私たちの最終的な効果を明らかにすると思います。はい、プログラムを実行するときは、最初に出力hello premain
してから出力しますhello main
。
main()メソッドはプログラムのスタートアップエントリではありませんか?main()メソッドはプログラムのエントリポイントなので、最初にmain()メソッドを実行してみませんか?
心配しないで、最初に最終的な効果を見てみましょう。内部原理については、[バイトコードプログラミング]列の後の記事で詳しく紹介します。
初めてプログラムを実行する
ここでも、main()メソッドを実行する必要があり、コンソール出力の効果は次のようになります。
私が行く、状況はどうですかhello premain
、それhello main
は最初に出力してから出力するということではありませんでしたか?なぜ出力するだけなのhello main
か?ロールオーバーしましたか?
実際、ここにプログラムの簡単な構成が必要です。
構成者
まず、IDEAでMavenを構成し、bytecode-javassist-01
プロジェクトをJarファイルにbytecode-javassist-01-1.0.0-SNAPSHOT.jar
パッケージ化し、パッケージ化されたファイルをDドライブのルートディレクトリにコピーします(任意のディレクトリにコピーできます)。
次に、IDEAでmain()メソッドの起動パラメーターを構成し、IDEAのプログラム引数に次の構成を入力します。
-javaagent:D:\bytecode-javassist-01-1.0.0-SNAPSHOT.jar
をクリックしApply
、次にをクリックしますOK
。構成を完了します。
プログラムをもう一度実行します
あなたはそれを見ましたか、友人、それは確かに最初に出力さhello premain
れ、次に出力されますhello main
。
次の期間に、バイトコードプログラミングの魔法の旅を始めましょう。
要約する
[バイトコードプログラミング]の冒頭として、記事の冒頭で、Bingheは、混乱の時期にある小さなパートナーに助けを与えることを望んで、多くの小さなパートナーの混乱についていくつかの簡単な提案をしました。
次に、動的バイトコード技術、バイトコードプログラミングの実装方法、およびバイトコードプログラミングの使用シナリオを紹介しました。最後に、小さなケースを通して、main()メソッドはプログラム全体のエントリポイントですが、main()メソッドが実行される前に他のメソッドを実行できることを友人に認識させます。
最後に、良いニュースをお伝えしたいと思います。長い間懸命に働いた後、Bingheの個人ブログがまもなくオンラインになり、ing~~を楽しみにしています。
さて、今日はここでやめましょう、私は氷河です、また会いましょう~~
最後に書く
大きな工場に参入したい、昇進や昇給をしたい、または現在の仕事について混乱している場合は、私にメッセージを送って連絡することができます。私の経験のいくつかがあなたに役立つことを願っています~~
推奨読書:
- 「実践は真の知識をもたらします。ネットワーク全体で最強のseckillシステムのアーキテクチャを解読することで、すべてのseckillがseckillであるとは限りません。!》
- 「ゼロから数億人のユーザーまで、MySQLデータベースを段階的に最適化するにはどうすればよいですか?(おすすめコレクション)》
- 「私はマルチスレッドを使用して、10億レベルのトラフィックeコマースビジネスの下で大規模なデータ校正システムをさらに最適化し、パフォーマンスが200%向上しました。!(全体が乾いているので、集めることをお勧めします)》
- 「私はマルチスレッドを使用して、10億レベルのトラフィックeコマースビジネスの下で大規模なデータ校正システムを最適化しました。パフォーマンスは直接200%向上しました。!(全体が乾いているので、集めることをお勧めします)》
- 「同時プログラミングに最適な学習ルートを10枚の写真でまとめました。!(おすすめコレクション)》
- 「同時実行性の高いシナリオでは、読み取り/書き込みロックよりも高速なロックです。これを読んだ後、私は完全に確信しています。!(おすすめコレクション)》
- 「ネットワーク全体の最も完全なパフォーマンス最適化の要約!!(氷河吐血アレンジメント、推奨コレクション)》
- 「MyBatisを3日間プレイした後は、お気軽にお問い合わせください。!(氷河吐血アレンジメント、推奨コレクション)》
- 「働き始めたばかりの人へのアドバイス:大きな工場に入るには、これらの並行プログラミングの知識を習得する必要があります。完全な学習ルート!!(おすすめコレクション)》
- 「働き始めたばかりのジュニアやジュニアへのアドバイス:大きな工場に入るには、これらのコアスキルを習得する必要があります!完全な学習ルート!!(おすすめコレクション)》
- 「仕事を始めたばかりの人へのアドバイス:これらのコンピューターとオペレーティングシステムの基本を早く理解すればするほどよいでしょう。10,000文字の長さのテキストはトップすぎます!!(おすすめコレクション)》
- 「私は3日間ですべての年齢層に適した全国レベルのゲームを開発し、音楽の再生をサポートし、完全なソースコードとコメント(推奨コレクション)を開きます!!》
- 「私はネットワーク全体で最もハードコアな同時実行性プログラミングの作者であり、CSDNで最も注目に値するブロガーです。同意しますか?(おすすめコレクション)》
- 「卒業から5年後、月給3,000から年俸100万まで、どのようなコアスキルを身につけましたか?(おすすめコレクション)》
- 「隣の女の子のWifiをハッキングして見つけました。。。(実際の戦闘乾物の全工程、収集することをお勧めします) "
- 「『パンダバーニングお香』を軽く試さないでください、いや、後悔します!》
- 「墓掃除の日はこっそりと「パンダお香」を訓練し、私のコンピューターはパンダに「専用」になりました!》
- 「Java8の新機能でいっぱいの73万語、あなたがそれを読むことができるとは思わない!(おすすめコレクション)》
- 「営業時間のピーク時にサーバーのプラグを抜くのはどうですか?》
- 「ネットワーク全体で最も完全なLinuxコマンドの要約!!(歴史上最も完全な、推奨コレクション) "
- 「Pythonでツールを作成し、MySQLを完全にクラックしました。!(おすすめコレクション)》
- SimpleDateFormatクラスがスレッドセーフではないのはなぜですか?(6つのソリューション、推奨コレクション) "
- 「MySQL8のこれらの3つの新しいインデックスは、MySQLを直接離陸させました、あなたはそれさえ知らないのです!!(おすすめコレクション)》
- 「Springのソースコードを完成させた後、この分散キャッシュフレームワークをオープンソース化しました。!(おすすめコレクション)》
- 「1億レベルのトラフィックの高い同時スパイクシステムの製品は、使用されているJDK同期コンテナにこれらの2つの巨大なピットがあるという理由だけで、「売られ過ぎ」です。!(ピットを踏んだ記録、収集をお勧めします)」
- 「作業を始めたばかりの人にアドバイスしてください。並行プログラミングを上手に学びたいのであれば、これらの並行コンテナの落とし穴に注意を払う必要があります。!(おすすめコレクション)》
- 「会社のレポートツールは使いにくいです。3日でExcelツールを手に入れました。オペレーションレディはとても使いやすいと言って、今ではオープンソースになっています!!(おすすめコレクション)》
- 「働き始めたばかりの人へのアドバイス:大きな工場に参入したいのなら、並行プログラミングのこれらのコアスキルはあなたが習得しなければならないものです!!(おすすめコレクション)》
- 「アリインタビュアー:同時実行性とトラフィックの多いスパイクシステムは、在庫の売られ過ぎの問題をどのように正しく解決しますか?(おすすめコレクション)》
- 「5つのデータ型と使用シナリオの概要を再確認してください!!(完全な実際の戦闘ケースを含む、収集することをお勧めします)》
さて、今日ここで立ち止まって、友達、いいね、お気に入り、コメント、そしてワンクリックで歩き始めましょう、私は氷河です、次の号でお会いしましょう~~