J'écris une application en utilisant le JVMTI. J'essaye d'instrument le bytecode: en injectant des appels de méthode sur chaque entrée de méthode.Résolution de dépendances dans JNI DefineClass
Je sais comment faire cela, mais le problème est dans la classe d'instrument, disons qu'il s'appelle Proxy
, que je charge en utilisant la fonction JNI DefineClass. Mon Proxy
a quelques dépendances dans la bibliothèque de classes Java, actuellement juste java.lang.ThreadLocal<Boolean>
.
Maintenant, dire que j'ai cela, où inInstrumentMethod
est une boolean
simple:
public static void onEntry(int methodID)
{
if (inInstrumentMethod) {
return;
} else {
inInstrumentMethod = true;
}
System.out.println("Method ID: " + methodID);
inInstrumentMethod = false;
}
Le code compile et fonctionne. Cependant, si je fais inInstrumentMethod
un java.lang.ThreadLocal<Boolean>
, j'obtiens un NoClassDefFoundError. Le code:
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);
}
Je pense que les dépendances ne sont pas résolus correctement et java.lang.ThreadLocal
n'a pas été chargé (et ne pouvaient donc pas être trouvés). La question est, alors, comment puis-je forcer Java à charger java.lang.ThreadLocal
? Je ne pense pas que je pourrais utiliser DefineClass
dans ce cas; Y a-t-il une alternative?
Vous obtenez 'NoClassDefFoundError' pour quelle classe? – EJP