赞
踩
javaagent是java命令的一个参数。改参数可指定一个jar包,一条java命令中可多次出现javaagent,对于jar包有下面两个要求:
premain方法是中JVM启动时先于main函数运行的,JVM启动时会先运行-javaagent指定类的premain方法。
同时javaagent命令要求指定的类必须有premain(),并且对其方法对签名也有要求:
public static void premain(String agentArgs, Instrumentation inst);
public static void premain(String agentArgs);
JVM会优先价值带Instrumentation签名的方法,加载成功忽略第二种,如果第一种没有,则加载第二种方法。
Instrumentation类定义如下:
public interface Instrumentation { //增加一个Class 文件的转换器,转换器用于改变 Class 二进制流的数据,参数 canRetransform 设置是否允许重新转换。 void addTransformer(ClassFileTransformer transformer, boolean canRetransform); //在类加载之前,重新定义 Class 文件,ClassDefinition 表示对一个类新的定义,如果在类加载之后,需要使用 retransformClasses 方法重新定义。addTransformer方法配置之后,后续的类加载都会被Transformer拦截。对于已经加载过的类,可以执行retransformClasses来重新触发这个Transformer的拦截。类加载的字节码被修改后,除非再次被retransform,否则不会恢复。 void addTransformer(ClassFileTransformer transformer); //删除一个类转换器 boolean removeTransformer(ClassFileTransformer transformer); boolean isRetransformClassesSupported(); //在类加载之后,重新定义 Class。这个很重要,该方法是1.6 之后加入的,事实上,该方法是 update 了一个类。 void retransformClasses(Class<?>... classes) throws UnmodifiableClassException; boolean isRedefineClassesSupported(); void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException; boolean isModifiableClass(Class<?> theClass); @SuppressWarnings("rawtypes") Class[] getAllLoadedClasses(); @SuppressWarnings("rawtypes") Class[] getInitiatedClasses(ClassLoader loader); //获取一个对象的大小 long getObjectSize(Object objectToSize); void appendToBootstrapClassLoaderSearch(JarFile jarfile
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。