当前位置: 首页 > 知识库问答 >
问题:

JavaClassLoader-强制重新加载已经加载的类

王兴庆
2023-03-14

我目前正在尝试将类加载到我的应用程序中,这样我就可以过滤掉那些不包含任何test/@test-方法的类。我希望以后在我的应用程序中运行这些测试。

到目前为止,一切都很好-除了我正在使用的URLClassLoader(或者可能是任何ClassLoader)似乎没有实际重新加载位于我的应用程序类路径上的类。

更准确地说,我的应用程序的用户首先选择一些. java源文件。然后将它们复制到临时位置,并将许多正则表达式匹配/替换对应用于原始源文件的副本。接下来,拷贝被编译,然后我想把那些编译的. class-文件加载到我的应用程序中,这样我就可以把它们作为测试运行了。
在大多数情况下,这是理想的。

不幸的是,如果任何选定文件的完全限定类名(FQCN)与作为此应用程序一部分的类的FQCN相同(例如此应用程序的测试),类加载忽略指定的路径(到%temp%\myfolder\)以及位于此处的类文件的(更新)版本,而是使用已经存在/加载的类版本。

经过一些研究,根据文档(强调我的),这种行为是可以预期的:

•ClassLoader中的loadClass方法在调用加载类时按顺序执行以下任务:
-如果类已加载,则返回该类
-否则,它会将新类的搜索委托给父类加载器
-如果父类装入器找不到该类,loadClass将调用findClass方法查找并装入该类。

我尝试使用findClass,但不幸的是它不可见。

共有1个答案

朱兴学
2023-03-14

类加载器首先委托给它的父类加载器,这是它确定“类是否已经加载”的方式。如果您想强制一个类加载器加载一个新类,一种方法是在链中插入另一个无法加载/查找相同类的类加载器。非常快速,不完整的例子:

class FirewallLoader extends ClassLoader {
    public FirewallLoader(ClassLoader parent) {
        super(parent);
    }
    public loadClass(String name, boolean resolve) {
        if (name.equals("some.class.Xyz")) {
            throw ClassNotFoundException();
        }
        super.loadClass(name, resolve);
    }
}

您将“FirewallLoader”设为父类或URLClassLoader,然后URLClassLoader将加载防火墙装入器过滤掉的任何类的新版本。

 类似资料:
  • 在服务器迁移过程中,一个新的nginx配置缺少缓存控制指令。因此,我们最终得到了缓存的,这对我们的SPA非常不利,如果我们部署新代码,它将不再刷新。我们需要index.html不被缓存。 这是我们的(不好的)nginx配置,几天来一直在线: 我们修复了我们的配置: 问题 过去几天内访问过我们网页的客户端缓存了一个旧索引。html。我们如何强制他们的浏览器删除缓存的?

  • 问题内容: 我有一个页面正在从第三方(新闻提要)加载脚本。脚本的url在加载时动态分配(根据第三方代码)。 然后从中加载的脚本创建并加载具有新闻提要中各种内容的元素,并以漂亮的格式等将元素加载到其中(传入ID“ div1287”,以便脚本知道在何处加载内容)。 唯一的问题是,它只会加载一次。我希望它每n秒重新加载一次(从而显示新内容)。 所以,我想我会尝试一下: div清除后,我得到警报,但是没有

  • 问题内容: 我会尽力解释这一点。 我有一个应用程序可以在页面上显示50多个项目。用户可以单击单个项目,然后转到页面以更新项目信息。一切工作正常,除了在用户完成更新单个项目信息并在浏览器上单击“后退”按钮到上一个按钮之后。旧项目信息(更新前)仍然存在。用户必须单击刷新才能查看更新的信息。不错,但我希望提供更好的用户体验。有解决这个问题的主意吗?非常感谢。 问题答案: 我认为您必须使用JS才能使此工作

  • 问题内容: 背景: 我有一个MainTest类,其中包含许多按钮,每个按钮都实例化我正在编码/测试的类。我希望这些类的代码/测试周期更快,并希望每分钟几次快速查看更改的效果。稳定的MainTest大约需要20秒的加载时间,如果我实例化的类中的每个更改都不需要重新加载它,这将不是问题。我想一次加载MainTest,当它实例化另一个类时,我们多次调用它为ChildTest(通过按钮事件),它应该重新加

  • 使用Ionic框架在登录/注销时完成清除历史记录和重新加载页面后 我想知道同样的问题,但对于ionic2使用typecript。 在登录和注销时,我需要重新加载应用程序。ts,因为有些类在构造上运行库。 它基本上是重定向到家庭并重新加载。

  • 问题内容: 我正在使用Ionic Framework开发应用程序,并且有多个视图。路由名称是 app.view1 和 app.view2 。我使用控制器切换到下一个视图,当我单击返回时,app.view1的控制器不再执行,这在我的应用程序中非常重要。 请告诉我如何在每次路由到控制器时执行它。 问题答案: Ionic缓存视图以提高性能。它使用的功能。 Ionic最多可以缓存10个视图,不仅可以配置它