Java代理会忽略应用程序的类路径

时间:2019-01-07 14:53:05

标签: java classpath javaagents

我正在编写我的第一个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。为什么它会忽略我的应用程序的类路径?

1 个答案:

答案 0 :(得分:1)

premain方法之前执行main方法。顾名思义,该数组中仅包含已加载的类。在执行代理的时间点上,主类根本还没有加载。