gpt4 book ai didi

java - 解决 JNI DefineClass 中的依赖关系

转载 作者:行者123 更新时间:2023-11-30 06:35:12 29 4
gpt4 key购买 nike

我正在使用 JVMTI 编写一个应用程序。我正在尝试检测字节码:通过在每个方法条目上注入(inject)方法调用。

我知道该怎么做,但问题出在仪器类中,假设它被称为 Proxy ,我使用 JNI 函数 DefineClass 加载它。我的Proxy在 Java 类库中有一些依赖项,目前只有 java.lang.ThreadLocal<Boolean> .

现在,假设我有这个,其中 inInstrumentMethod是一个简单的 boolean :

public static void onEntry(int methodID)
{
if (inInstrumentMethod) {
return;
} else {
inInstrumentMethod = true;
}

System.out.println("Method ID: " + methodID);

inInstrumentMethod = false;
}

代码编译并运行。但是,如果我做 inInstrumentMethod一个java.lang.ThreadLocal<Boolean> ,我收到 NoClassDefFoundError。代码:

private static ThreadLocal<Boolean> inInstrumentMethod = new ThreadLocal<Boolean>() {
@Override protected Boolean initialValue() {
return Boolean.FALSE;
}
};

public static void onEntry(int methodID)
{
if (inInstrumentMethod.get()) {
return;
} else {
inInstrumentMethod.set(true);
}

System.out.println("Method ID: " + methodID);

inInstrumentMethod.set(false);
}

我的猜测是依赖关系尚未正确解决,并且 java.lang.ThreadLocal未加载(因此无法找到)。那么问题是,如何强制Java加载java.lang.ThreadLocal ?我认为我不能使用DefineClass在这种情况下;有替代方案吗?

最佳答案

我认为解决标准类java.lang.ThreadLocal没有问题,而是由扩展它的内部类生成

new ThreadLocal<Boolean>() {
@Override protected Boolean initialValue() {
return Boolean.FALSE;
}
};

由于内部类和外部类之间的循环依赖,通过DefineClass解决这个问题确实是不可能的,所以没有允许定义它们的顺序,除非你有一个成熟的按需返回类的 ClassLoader

最简单的解决方案是完全避免生成内部类,这在 Java 8 中是可行的:

private static ThreadLocal<Boolean> inInstrumentMethod
= ThreadLocal.withInitial(() -> Boolean.FALSE);

如果您使用 Java 8 之前的版本,则不能以这种方式使用它,因此在这种情况下最好的解决方案是重写代码以接受 null 的默认值:初始值,无需指定不同的初始值:

private static ThreadLocal<Boolean> inInstrumentMethod = new ThreadLocal<>();

public static void onEntry(int methodID)
{
if (inInstrumentMethod.get()!=null) {
return;
} else {
inInstrumentMethod.set(true);
}

System.out.println("Method ID: " + methodID);

inInstrumentMethod.set(null);
}

您还可以将该匿名内部类转换为顶级类。从那时起,该类不再依赖于以前的外部类,在定义使用它的类之前首先定义 ThreadLocal 的子类型应该可以解决问题。

关于java - 解决 JNI DefineClass 中的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316832/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com