在什么情况下将调用Java代理premain方法?

在什么情况下将调用Java代理premain方法?,java,javaagents,Java,Javaagents,我对“类加载”的概念和javaagent有点困惑 假设我有这样一个代理类: import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class Agent {

我对“类加载”的概念和javaagent有点困惑

假设我有这样一个代理类:

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
            }
        });
    }

} 
导入java.lang.instrument.ClassFileTransformer;
导入java.lang.instrument.IllegalClassFormatException;
导入java.lang.instrument.Instrumentation;
导入java.security.ProtectionDomain;
公共类代理{
公共静态无效预输入(字符串代理、仪器仪表){
inst.addTransformer(新的ClassFileTransformer(){
@凌驾
公共字节[]转换(类加载器类加载器,字符串s,类aClass,ProtectionDomain ProtectionDomain,字节[]字节)引发IllegalClassFormatException{
//用于更改字节码的ASM代码
}
});
}
} 
我通过将
Premain类设置为
agent
类来创建一个代理jar

现在,当我的虚拟机使用
-javaagent
启动时,我正在传递这个代理jar,所以问题是:

  • 何时调用
    premain
    ?仅当类装入器装入类时?如果是这样,那么该
    premain
    将在
    引导程序
    扩展程序
    系统
    加载程序中为每个类准确调用一次

  • 或者当我创建一个类的对象,然后调用它的方法时


  • 将调用代理的
    premain
    方法

    Java虚拟机(JVM)初始化后,每个 方法将按照指定代理的顺序调用,然后 将调用实际应用程序main方法。每个premain方法都必须 返回以继续启动序列


    将调用代理的
    premain
    方法

    Java虚拟机(JVM)初始化后,每个 方法将按照指定代理的顺序调用,然后 将调用实际应用程序main方法。每个premain方法都必须 返回以继续启动序列


    哦,好的。因此,基本上,
    Instrumentation
    addTransformer
    会被调用,因为每次类加载都发生了,对吗?@Ant的
    addTransformer
    也会在给定代码后被调用。但是,transformer的
    transform
    方法将为每个已加载的类调用,请参见Thank,现在它有意义了ok。因此,基本上,
    Instrumentation
    addTransformer
    会被调用,因为每次类加载都发生了,对吗?@Ant的
    addTransformer
    也会在给定代码后被调用。但是,transformer的
    transform
    方法将为每个加载的类调用,请参见Thank,现在它有意义了