原创

Java コードをインストルメント化してバイトバディまたは ASM を使用して変数割り当てデータを収集する方法

温馨提示:
本文最后更新于 2024年04月12日,已超过 48 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

プログラムの実行中に変数指定データを取得するにはコードをどのようにインストルメント化すればよいですか?

今度のコードを考えてみます。

public class Test2 {
    public boolean isSerialKeyValid(String serial) {
        if (!serial.toLowerCase().startsWith("@v3")) {
            return isV1V2SerialValid(serial);
        }
        return isV3SerialValid(serial);
    }

    private boolean isV1V2SerialValid(String serial) {
        if (serial.toLowerCase().startsWith("@v1")) {
            String serialValue = serial.split("@v1")[1];
            return isV1ChecksumValid(serialValue);
        }
        String serialValue = serial.split("@v2")[1];
        return isV2ChecksumValid(serialValue);
    }

    private boolean isV1ChecksumValid(String v1Serial) {
        if (!v1Serial.matches("\\d+")) {
            return false;
        }
        String[] items = v1Serial.split("\\d");
        int sum = 0;
        for (String item : items) {
            sum += Integer.parseInt(item);
        }
        return sum % 13 == 0;
    }

    private boolean isV2ChecksumValid(String v2Serial) {
        String trimmedSerial = v2Serial.trim();
        if (trimmedSerial.length() != 8) {
            return false;
        }
        return trimmedSerial.matches("[^A-Za-z]+\\w{3}[^A-Za-z]+");
    }

    private boolean isV3SerialValid(String v3Serial) {
        String serialValue = v3Serial.split("@v3")[1];
        return isV3ChecksumValid(serialValue);
    }

    private boolean isV3ChecksumValid(String v3Serial) {
        return v3Serial.length() == 10 && v3Serial.matches(".*@!=.*");
    }
}

public class SampleTestSuit {
    public static void main(String[] args) {
        System.out.println(validatedSerialKey("@v2123ali34"));
    }

    public static boolean validatedSerialKey (String str) {
        if (str.startsWith("@v1") || str.startsWith("@v2") || str.startsWith("@v1")) {
            Test2 test2 = new Test2();
            return test2.isSerialKeyValid(str);
        }
        return false;
    }
}

main メソッドの実行時に、レコードの値を関数に渡したいと考えています。上記の例について、私が取得したいサンプル出力を次に示します。

{
              methodName: TestSuit2.Test2#isSerialKeyValid,
              parametersValue:[
                  {
                      paramName: serial,
                      paramValue: "@v2123ali34"
                  }
              ]
          },
          {
              methodName: TestSuit2.Test2#isV1V2SerialValid,
              parametersValue:[
                  {
                      paramName: serial,
                      paramValue: "@v2123ali34"
                  }
              ]
          },
          {
              methodName: Java.Lang.String#toLowerCase,
              parametersValue:[
                  {
                      paramName: ?,
                      paramValue: "@v2123ali34"
                  }
              ],
          },

グーグルも書いた計測者しかし、そのライブラリは変数名とそのランタイム値を取得できませんでした(または、その目的のためのリソースが見つかりませんでした)

のようなライブラリを使用する必要がありますかバイト仲間またはASM?私の目標のJDKは8です。

ありがとう

正文到此结束
热门推荐
本文目录