All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alibaba.bytekit.utils.BytecodeRetrievalTool Maven / Gradle / Ivy

package com.alibaba.bytekit.utils;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 运行时获取 JVM 实际字节码
 * @author hengyunabc 2024-02-27
 */
public class BytecodeRetrievalTool {

    public static byte[] getClassBytecode(Instrumentation instrumentation, Class clazz) {
        // 用于保存类字节码的引用
        AtomicReference bytecodeRef = new AtomicReference<>();

        // 创建一个 ClassFileTransformer,捕获类的字节码
        ClassFileTransformer transformer = new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
                    ProtectionDomain domain, byte[] classfileBuffer) throws IllegalClassFormatException {

                if (classBeingRedefined != null) {
                    if (clazz != classBeingRedefined) {
                        return null;
                    }
                }

                if (clazz.getName().replace('.', '/').equals(className)) {
                    bytecodeRef.set(classfileBuffer);
                    return null;
                }
                return null;
            }
        };

        // 注册 transformer
        instrumentation.addTransformer(transformer, true);

        try {
            instrumentation.retransformClasses(clazz);
        } catch (Exception e) {
            throw new RuntimeException("Retransformation failed", e);
        } finally {
            instrumentation.removeTransformer(transformer);
        }

        return bytecodeRef.get();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy