バイトコードプログラミング|長年働いた後も、CRUDを繰り返し実行していますか?このテクノロジーに触れたことはありますか?

みなさん、こんにちは。氷河です~~

最近、たくさんの友達とおしゃべりをしていると、記事を読んでいるあなたや私も含めて、ほとんどの人が長い間働いていることがわかりました。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~~を楽しみにしています。

さて、今日はここでやめましょう、私は氷河です、また会いましょう~~

最後に書く

大きな工場に参入したい、昇進や昇給をしたい、または現在の仕事について混乱している場合は、私にメッセージを送って連絡することができます。私の経験のいくつかがあなたに役立つことを願っています~~

推奨読書:

さて、今日ここで立ち止まって、友達、いいね、お気に入り、コメント、そしてワンクリックで歩き始めましょう、私は氷河です、次の号でお会いしましょう~~

おすすめ

転載: blog.csdn.net/l1028386804/article/details/123788552