Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

bytekinを始める

このセクションでは、bytekinのセットアップと最初のバイトコード変換の作成方法を説明します。

前提条件

  • Java 8以上
  • Javaの基本的な理解
  • MavenまたはGradle(依存関係管理のため)

インストール

Maven

pom.xmlに以下を追加してください:

<dependency>
    <groupId>io.github.brqnko.bytekin</groupId>
    <artifactId>bytekin</artifactId>
    <version>1.0</version>
</dependency>

Gradle

build.gradleに以下を追加してください:

dependencies {
    implementation 'io.github.brqnko.bytekin:bytekin:1.0'
}

最初の変換

ステップ1: フッククラスの作成

ターゲットクラスをどのように変換したいかを定義する@ModifyClassアノテーションを持つクラスを作成します:

import io.github.brqnko.bytekin.injection.ModifyClass;
import io.github.brqnko.bytekin.injection.Inject;
import io.github.brqnko.bytekin.injection.At;
import io.github.brqnko.bytekin.data.CallbackInfo;

@ModifyClass("com.example.Calculator")
public class CalculatorHooks {

    @Inject(methodName = "add", methodDesc = "(II)I", at = At.HEAD)
    public static CallbackInfo onAddHead(int a, int b) {
        System.out.println("Adding " + a + " + " + b);
        return CallbackInfo.empty();
    }
}

ステップ2: トランスフォーマーの作成

フッククラスでBytekinTransformerをインスタンス化します:

BytekinTransformer transformer = new BytekinTransformer.Builder(CalculatorHooks.class)
    .build();

ステップ3: クラスの変換

ターゲットクラスのバイトコードに変換を適用します:

byte[] originalBytecode = loadClassBytecode("com.example.Calculator");
byte[] transformedBytecode = transformer.transform("com.example.Calculator", originalBytecode);

ステップ4: 変換されたクラスの使用

カスタムClassLoaderを使用して、変換されたバイトコードをJVMにロードします:

ClassLoader loader = new ByteArrayClassLoader(transformedBytecode);
Class<?> transformedClass = loader.loadClass("com.example.Calculator");

結果

変換されたクラスには、addメソッドにロギングが追加されます:

// 元のコード
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

// 変換後のコード
public class Calculator {
    public int add(int a, int b) {
        System.out.println("Adding " + a + " + " + b);  // インジェクション済み!
        return a + b;
    }
}

次のステップ