javaagent(使用 Javassist 编写)无法正常工作
javaagent (written using Javassist) not working properly
我正在编写一个 java 代理并使用 javassist 库来修改字节码。
我有一个主代理 class (MyAgent) 和一个 class 文件转换器 class。 MyAgent.java注册变压器classMyClzTransformer
public class MyAgent
{
private static Instrumentation instrumentation;
public static void premain(String arg, Instrumentation inst)
{
inst.addTransformer(new MyClzTransformer());
}
}
-
public class MyClzTransformer implements ClassFileTransformer
{
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
{
if (className.startsWith("a/b/"))
{
ClassPool clPool = ClassPool.getDefault();
System.out.println("clPool =======> " + clPool);
try
{
CtClass ctClass = clPool.get(className);
System.out.println("ct class: " + ctClass + ": methods = " + Arrays.deepToString(ctClass.getMethods()));
for(CtMethod method : ctClass.getMethods())
{
method.insertAfter("System.out.println(\" ============ added instrumented code ============ \");");
}
}
catch (NotFoundException | CannotCompileException | IOException e)
{
e.printStackTrace();
}
}
return classfileBuffer;
}
}
当我 运行 MyAgent jar 作为 java 代理时,如下所示:
java -javaagent:<path to myagent.jar> a.b.MyTestProgram
我没有得到任何日志 (sysouts) 输出。
是否是 class加载器问题?因为,clPool.get(className)
之后的日志没有执行。我没有从 try block
.
中得到任何输出
有一个基本错误。虽然 class 名称由 / 分隔,即 if (className.startsWith("a/b/"))
使用相同的格式 calssName
加载 class,这是不正确的。
修正是CtClass ctClass = clPool.get(className.replaceAll("/","."));
我正在编写一个 java 代理并使用 javassist 库来修改字节码。
我有一个主代理 class (MyAgent) 和一个 class 文件转换器 class。 MyAgent.java注册变压器classMyClzTransformer
public class MyAgent
{
private static Instrumentation instrumentation;
public static void premain(String arg, Instrumentation inst)
{
inst.addTransformer(new MyClzTransformer());
}
}
-
public class MyClzTransformer implements ClassFileTransformer
{
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
{
if (className.startsWith("a/b/"))
{
ClassPool clPool = ClassPool.getDefault();
System.out.println("clPool =======> " + clPool);
try
{
CtClass ctClass = clPool.get(className);
System.out.println("ct class: " + ctClass + ": methods = " + Arrays.deepToString(ctClass.getMethods()));
for(CtMethod method : ctClass.getMethods())
{
method.insertAfter("System.out.println(\" ============ added instrumented code ============ \");");
}
}
catch (NotFoundException | CannotCompileException | IOException e)
{
e.printStackTrace();
}
}
return classfileBuffer;
}
}
当我 运行 MyAgent jar 作为 java 代理时,如下所示:
java -javaagent:<path to myagent.jar> a.b.MyTestProgram
我没有得到任何日志 (sysouts) 输出。
是否是 class加载器问题?因为,clPool.get(className)
之后的日志没有执行。我没有从 try block
.
有一个基本错误。虽然 class 名称由 / 分隔,即 if (className.startsWith("a/b/"))
使用相同的格式 calssName
加载 class,这是不正确的。
修正是CtClass ctClass = clPool.get(className.replaceAll("/","."));