jos*_*pos 5 java instrumentation jvm classloader
使用 CustomClassloader 或 Java 代理 + Instrumentation API 都可以非常简单直接地获取 JVM 已加载的所有类。然而,已经初始化的类列表似乎并不那么容易获取。(其实我想知道有没有什么办法可以得到)
那么,有没有办法知道一个类是否已经初始化了呢?
- 提前致谢
我不确定 Instrumentation API,但一种可能的方法是使用 JVMTIGetClassStatus函数。
通过工具接口可以获得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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |