使用自定义类加载器或Java代理+Instrumentation API,可以很容易地获取JVM加载的所有类。但是,已初始化的类列表似乎不那么容易获得。(实际上我想知道是否有任何方法可以获得它)
那么,有没有办法知道一个类是否已经被初始化?
-- 提前致谢。
使用自定义类加载器或Java代理+Instrumentation API,可以很容易地获取JVM加载的所有类。但是,已初始化的类列表似乎不那么容易获得。(实际上我想知道是否有任何方法可以获得它)
那么,有没有办法知道一个类是否已经被初始化?
-- 提前致谢。
我不确定仪器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
}
}
MyClassesCollector.list.add(MethodHandles.lookup().lookupClass());
此外,服务性代理也可以这样做,但会冻结目标进程。 - commit-man