在什么情况下 Java Agent premain 方法会被调用?

At what event Java Agent premain method will be called?

我对 "class loading" 概念和 javaagent 有点困惑。

假设我有这样的代理 class:

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;

public class Agent {

    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {

                // ASM Code for changing the bytecodes
            }
        });
    }

} 

我通过设置 Premain-ClassAgent class 创建了一个代理 jar。

现在我在使用 -javaagent 启动 VM 时传递此代理 jar,所以问题是:

  1. premain 什么时候会被调用?仅当 class 由 class 加载程序加载时?如果是这样,那么对于每个 class 在 bootstrapextensionsystem loaders?

    [=35= 中,这个 premain 只被调用一次]
  2. 或者我什么时候创建一个 class 的对象然后调用它的方法?

代理的premain方法将被调用once

After the Java Virtual Machine (JVM) has initialized, each premain method will be called in the order the agents were specified, then the real application main method will be called. Each premain method must return in order for the startup sequence to proceed.