如何知道某个类是否已初始化?

时间:2016-08-25 19:42:37

标签: java jvm classloader instrumentation

使用CustomClassloader或Java代理+ Instrumentation API非常简单直接地获取JVM加载的所有类。但是,已经初始化的类列表似乎不那么容易获得。 (我真的想知道是否有任何方法可以获得它)

那么,有没有办法知道一个类是否已被初始化?

- 提前致谢

1 个答案:

答案 0 :(得分:3)

我不确定Instrumentation API,但一种可能的方法是使用JVMTI GetClassStatus函数。

使用工具界面,您可以获取JVM加载的所有类,并找出没有JVMTI_CLASS_STATUS_INITIALIZED状态标志的那些

JavaVM *jvm;
jvmtiEnv *jvmti;
jvmtiError err;

env->GetJavaVM(&jvm);
jvm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_2);

jint classCount = 0;
jclass * classes;

jvmti->GetLoadedClasses(&classCount, &classes);
for (int i = 0; i < classCount; i++) {
    jint classStatus = 0;
    jvmti->GetClassStatus(classes[i], &classStatus);

    if (classStatus != JVMTI_CLASS_STATUS_PRIMITIVE
        && classStatus != JVMTI_CLASS_STATUS_ARRAY
        && classStatus != JVMTI_CLASS_STATUS_ERROR
        && !(classStatus & JVMTI_CLASS_STATUS_INITIALIZED)) {
        // static initializer is not finished yet
    }
}