Java sun.misc.Launcher $ AppClassLoader打破代码?

时间:2015-05-03 22:05:52

标签: java eclipse classloader

所以,我有一个类加载器ReflectionClassLoader,我用它来动态加载来自不同地方的JAR文件,以便使用混淆的代码环境。

这在我的IDE中运行良好,玩起来很有趣,但是当我在Eclipse中导出设置时,我发现我的类加载器是由标准URLClassLoader加载的,而{{1所以加载了两次。由于它存储了某些数据,如资源,加载的类等,它完全破坏了我的系统。在eclipse中,它们都由sun.misc.Launcher$AppClassLoader加载。

第二次加载似乎在加载我的自定义URL协议(debugrsrc)时很明显。我已尝试获取System ClassLoader并进行反映,但返回sun.misc.Launcher$AppClassLoader,即使它未在我的main方法中返回。

它似乎与程序的其余部分完全隔离。至于逃避,我想要拉一些不安全的,虽然我更喜欢让Sun不要乱用ClassLoaders。

1 个答案:

答案 0 :(得分:2)

我通过以下方式解决了这个问题:

ClassLoader oscl = sun.misc.Launcher.getLauncher().getClassLoader();
Field scl = ClassLoader.class.getDeclaredField("scl");
scl.setAccessible(true);
scl.set(null, oscl);
//reflect my real main method here, dont actually call the code because the system classloader will preload it.