在什么情况下 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-Class
到 Agent
class 创建了一个代理 jar。
现在我在使用 -javaagent
启动 VM 时传递此代理 jar,所以问题是:
premain
什么时候会被调用?仅当 class 由 class 加载程序加载时?如果是这样,那么对于每个 class 在 bootstrap
、extension
、system
loaders?
[=35= 中,这个 premain
只被调用一次]
或者我什么时候创建一个 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.
我对 "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-Class
到 Agent
class 创建了一个代理 jar。
现在我在使用 -javaagent
启动 VM 时传递此代理 jar,所以问题是:
[=35= 中,这个premain
什么时候会被调用?仅当 class 由 class 加载程序加载时?如果是这样,那么对于每个 class 在bootstrap
、extension
、system
loaders?premain
只被调用一次]或者我什么时候创建一个 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.