在什么情况下将调用Java代理premain方法?
我对“类加载”的概念和javaagent有点困惑 假设我有这样一个代理类:在什么情况下将调用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 {
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,现在它有意义了