我正在编写我的第一个Java代理,但遇到一个问题,即它不会加载我将代理附加到的应用程序的类。
当前,代理非常简单:
-v var1=val1
清单:
match=$(awk -v v1="$var1" -v v2="$var2" -v v3="$var3" 'BEGIN{FS=":"; OFS="-"}
$2 ~ v1 "|" v2 "|" v3' "$file")
当我使用此代理运行我的应用程序时,它仅打印其类(不打印我的应用程序的主类)。
我的应用程序:
public class Main {
public static void premain(String agentArgs, Instrumentation inst) {
transformClass(inst);
}
public static void agentmain(String agentArgs, Instrumentation inst) {
transformClass(inst);
}
private static void transformClass(Instrumentation instrumentation) {
System.out.println("Hello from agent!");
for (Class<?> clazz : instrumentation.getAllLoadedClasses()) {
System.out.println(clazz.getName());
}
}
}
运行结果:
Manifest-Version: 1.0
Can-Set-Native-Method-Prefix: true
Premain-Class: com.dvelopp.agenttest.Main
Agent-Class: com.dvelopp.agenttest.Main
Can-Redefine-Classes: true
Can-Retransform-Classes: true
... [stackoverflow不允许放置太多字符]
package com.dvelopp.agentconsumer;
public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
没有com.dvelopp.agenttest.Main,但是没有com.dvelopp.agentconsumer.Test。为什么它会忽略我的应用程序的类路径?
答案 0 :(得分:1)
在premain
方法之前执行main
方法。顾名思义,该数组中仅包含已加载的类。在执行代理的时间点上,主类根本还没有加载。