gpt4 book ai didi

java - 如何使用反射来检查使用不同类加载器加载的类的非静态字段?

转载 作者:行者123 更新时间:2023-12-02 05:06:10 25 4
gpt4 key购买 nike

我正在使用子 URLClassLoader 来加载可在运行时在 Android SDK (sdk/platforms/) 中找到的 android.jar,然后使用 Google Reflections 库来检查新的我加载的类。但是,似乎使用以下代码,我只能检查静态字段;我还想检查实例字段。 (不过我对方法没有任何问题!)

Path jarPath = fs.getPath("/android-sdk-macosx/platforms/android-10/android.jar");
URL[] urls = new URL[]{jarPath.toUri().toURL()};
Reflections r = new Reflections(new ConfigurationBuilder().setUrls(urls).setScanners(
new SubTypesScanner(false)
));

URLClassLoader cl = URLClassLoader.newInstance(urls, ClassLoader.getSystemClassLoader());
for (String cls : r.getAllTypes()) {
System.out.println(cls);
Class<?> c = cl.loadClass(cls);
Field[] allFields = c.getDeclaredFields();
for (Field f : allFields) {
System.out.println('\t' + (f.getModifiers() & Modifier.STATIC) + " " + f.getName());
}
}

例如,当上面的代码检查 android.view.View 时,它只打印以下内容:

android.view.View
8 VIEW_LOG_TAG
8 NO_ID
8 VISIBLE
8 INVISIBLE
8 GONE
8 DRAWING_CACHE_QUALITY_LOW
8 DRAWING_CACHE_QUALITY_HIGH
8 DRAWING_CACHE_QUALITY_AUTO
8 SCROLLBARS_INSIDE_OVERLAY
8 SCROLLBARS_INSIDE_INSET
8 SCROLLBARS_OUTSIDE_OVERLAY
8 SCROLLBARS_OUTSIDE_INSET
8 KEEP_SCREEN_ON
8 SOUND_EFFECTS_ENABLED
8 HAPTIC_FEEDBACK_ENABLED
8 FOCUSABLES_ALL
8 FOCUSABLES_TOUCH_MODE
8 FOCUS_BACKWARD
8 FOCUS_FORWARD
8 FOCUS_LEFT
8 FOCUS_UP
8 FOCUS_RIGHT
8 FOCUS_DOWN
8 EMPTY_STATE_SET
8 ENABLED_STATE_SET
8 FOCUSED_STATE_SET
8 SELECTED_STATE_SET
8 WINDOW_FOCUSED_STATE_SET
8 ENABLED_FOCUSED_STATE_SET
8 ENABLED_SELECTED_STATE_SET
8 ENABLED_WINDOW_FOCUSED_STATE_SET
8 FOCUSED_SELECTED_STATE_SET
8 FOCUSED_WINDOW_FOCUSED_STATE_SET
8 SELECTED_WINDOW_FOCUSED_STATE_SET
8 ENABLED_FOCUSED_SELECTED_STATE_SET
8 ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET
8 ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_SELECTED_STATE_SET
8 PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_FOCUSED_STATE_SET
8 PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_FOCUSED_SELECTED_STATE_SET
8 PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_ENABLED_STATE_SET
8 PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_ENABLED_SELECTED_STATE_SET
8 PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_ENABLED_FOCUSED_STATE_SET
8 PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET
8 PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET
8 PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET
8 OVER_SCROLL_ALWAYS
8 OVER_SCROLL_IF_CONTENT_SCROLLS
8 OVER_SCROLL_NEVER

But there is obviously more to it!

我做错了什么?

最佳答案

将 jar 文件通过反编译器后,结果发现 SDK 中的 android.jar 只是一个空壳,因此 Eclipse 和 IntelliJ 等 IDE 可以使用较小的 jar 来帮助自动完成。代码很好,但我需要检查完整的 jar 。我找到了一个托管这些完整 jar 的 Github 存储库:https://github.com/Sable/android-platforms ,如果有人感兴趣的话。

关于java - 如何使用反射来检查使用不同类加载器加载的类的非静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27772526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com