gpt4 book ai didi

java - Java 服务提供 API 应该如何工作?

转载 作者:搜寻专家 更新时间:2023-10-31 20:23:43 24 4
gpt4 key购买 nike

似乎每个人都对 Java Service Provider 不愉快。 ,你可以用一个名为 META-INF/services/com.example.Interface 的文件来做这件事,但是除了尝试加载正确的 XML 解析器之外没有人使用它。我正在尝试使用一个使用服务提供者 API 的库,并对其进行欺骗,以便我可以提供一些运行时扩展类(使用 cglib),这些类实际上并不实现接口(interface),但可以很容易地实现。

基本上,我认为我需要执行的步骤是:

  1. 创建一个将响应 getResources(...) 并返回“额外”URL 的自定义类加载器
  2. 还有那个类加载器 Hook getResourceAsStream(...) 以返回我将要使用 cglib 操作的类的列表,当被要求提供“额外”资源时
  3. 最后,让类加载器在请求时加载这些类

但这就是我迷路的地方。例如,当库试图确定那里有哪些实现者时,它会调用 getResources(...) 返回一堆 URL。但是 getResourceAsStream(...) 不采用 URL,它采用“名称”。名称似乎是类路径相关的,因此在任何地方都相同。所以 META-INF/services/com.example.Interface 与他们的 JAR 中的 META-INF/services/com.example.Interface 具有相同的“名称”,对吧?除了不知何故这适用于那些该死的 XML 解析器......

当然,所有这些都假设他们足够聪明/善良,可以调用 ClassLoader.getSystemClassLoader() 而不是使用 ClassLoader.getSystemResources(...)、ClassLoader.getSystemResourceAsStream(...) 等,就像在后一种情况无法 Hook ClassLoader 并提供伪造的文件。

我想在那种情况下,当我的代码被 Maven 打包时,我可以使用 BCEL 来操作类文件,而不是等到运行时再用 cglib 来操作吗?

最佳答案

我描述的想法是正确的。我犯的错误是认为使用 ClassLoader.getResourceAsStream(..) 来访问 URL 的内容。相反,您应该只是 URL.openStream()

如果我在发布之前找到它,java.util.ServiceLoader (@since 1.6) 提供了一些关于如何正确做事的见解。

关于java - Java 服务提供 API 应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4499526/

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