Windows用のJava IDEを学習プロジェクトとして開発しています。JNIを使用して変更されたクラスファイルをJVMにロードする
JNIを使用してJVMを呼び出し、javacを使用してコードをコンパイルしています。
JVMが正常に起動し、Javaコードが初めてコンパイルされたときにJVMがそれらをクラスパスから取り出し、正しく実行します。
しかし、私はJavaファイルを編集し、コンパイルして(スクリプトを使ってコンパイルして)コードを実行した後も、最初の実行時にコンパイルされたクラスファイルをロードします。変更を適用するには、プロセス全体を停止し、JVMを再起動する必要があります。
EclipseやIntelliJなどのIDEでこれが処理される方法があるはずです。しかし、私はどのように見つけることができませんでした。誰かが私を助けてくれたら本当に感謝しています。
私がクラスファイルを見つけてロードするために使用したコードは以下のとおりです。
bool load(const char* classFile)
{
JNIEnv* env;
bool isAttached = Interpreter::getEnv(&env);
auto javacls = env->FindClass(classFile);
if (javacls == nullptr)
{
getLogger().error("ERR: Loading class file %s failed", classFile);
env->ExceptionDescribe();
return false;
}
auto classInstance = getObject(javacls);
if (classInstance == nullptr)
{
getLogger().error("ERR: Invalid Object");
return false;
}
return true;
}
オンザフライでのコードの変更は、ネイティブコード[JVMTI](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html)の場合は、Instrumentation APIを介してのみ機能します。 #RetransformClasses.classes);それはデバッガが使用するものです。 – Holger
@Holgerありがとう。私はapiに目を通します。 –