当前位置: 首页 > 面试题库 >

如何愚弄Java Service Provider API(JAXP)

蒋栋
2023-03-14
问题内容

我有一个需要调用JAXP的小程序,特别是SAXParserFactory。现在,您可以从Javadoc中看到,它在内部使用了Service
Provider机制,如此处所述:

具体来说,如果它在我的任何应用程序JAR中都找不到文件,META- INF/services/javax.xml.parsers.SAXParserFactory它将尝试从我的应用程序代码库中获取文件。如果我按以下方式部署了applet:

<applet code="com.example.applets.MyApplet" 
 codebase="http://www.example.com/myapp/" archive="myapp.jar, dom4j.jar">

然后它将尝试向http://www.example.com/myapp/META-
INF/services/javax.xml.parsers.SAXParserFactory
发出HTTP请求

我宁愿不这样做,特别是因为我的小程序已签名,并且此额外的HTTP调用会触发有关未签名代码的警告。

现在,显而易见的解决方案是将META-INF /
services文件像它所说的那样放在我的应用程序JAR中,但是我该怎么做却仍然可以使用用户的JAXP的JRE默认实现来获得它?或者,是否有一种方法可以说服applet运行时
在我的JAR文件中codebase查看,而不在该文件的in中查看?

注意:我知道我也可以部署自己的JAXP-RI副本,但这对于applet来说是相当沉重的。


问题答案:

禁用代码库查找:

<applet ...>
 <param name="codebase_lookup" value="false">
</applet>

AppletClassLoader用于一个布尔属性检查sun.applet.AppletClassLoader.codebaseLookup,这可以通过设置上述参数的影响。该方法sun.applet.AppletPanel.init()将读取参数并将其设置为AppletClassLoader。一旦禁用,AppletClassLoader将停止对代码库中的类和资源进行远程查找,该类和资源是由给定的URL,codebase="http://www.example.com/myapp/"并且仅查看归档文件和系统类路径。

注意:我没有亲自测试,但是根据反汇编代码中的代码回顾,我确实相信它可以工作。

它也记录在JavaSE-技术说明-插件开发人员指南-
特殊属性中

codebase_lookup

当小应用程序类加载器需要加载类或资源(例如,META-INF /
services目录下的可插拔服务提供商的配置文件)时,它将首先在小应用程序JAR文件中搜索所需的文件,然后从小应用程序代码库中搜索。通常,将使用存储在applet
JAR文件中的所有必需的类和资源来部署applet。在这种情况下,无需进行代码库查找。

如果无法从applet
JAR文件中获得该类或资源,则最好使类加载器失败,而不是尝试进行代码库查找。否则,必须与applet代码库建立连接以搜索类或资源,并且这可能会对applet运行时产生性能影响。



 类似资料:
  • 因此,您希望(分别)记录进程或子进程的stdout和stderr,而不会使输出与您在终端中看到的不同,如果您没有记录任何内容。 看起来很简单不是吗?不幸的是,似乎不可能为这个问题编写一个通用的解决方案,在任何给定的过程中都有效。。。 管道重定向是一种分离stdout和stderr的方法,允许您单独记录它们。不幸的是,如果将标准输出/错误更改为管道,则进程可能会检测到管道不是tty(因为它没有宽度/

  • 问题内容: 试图获得公司名单,但这给了我一个错误。 例外: 我的文件包含: 当我要添加新的工作订单时,select中应该有可用的公司列表。 更新: 这是我的方法 : 问题答案: JSP包含操作返回的选择标记。添加订单时,它应该具有绑定到bean属性的属性。它应该是值堆栈中的一个对象。 在大多数情况下,最好在操作类中初始化该属性,以更好地实现必须编写方法和初始化列表的位置。 因为标签的属性不能为引发

  • 我是C的新手,目前我正在尝试编写一个Brainfuck解释器。到目前为止,我已经尝试过了。 它只在没有循环(“[”和“]”)的情况下工作。当我尝试时: 它给我输出 预期产出:

  • 数据格式如下: ui效果图 目前api接口只有位置返回位置和样品名称这两个个选项, tag是表格的标识,数据太多就省列了 功能点是 点击搜索样品id得出效果图的一行数据,也就是一个id只能搜索出一条数据, 请问大佬们 这个要如何弄呢?

  • 问题内容: 这个FileInputStream.available()javadoc说: 返回可以从此输入流读取(或跳过)而不会被该输入流的方法的下一次调用阻塞的剩余字节数的估计值。下一个调用可能是同一线程或另一个线程。仅读取或跳过此多个字节不会阻塞,但可能会读取或跳过较少的字节。 在某些情况下,非阻塞读取(或跳过)可能仅在速度较慢时(例如,在速度较慢的网络上读取大文件时)就被阻塞。 我不确定是否

  • 问题内容: 我需要打印以下代码: 像这样水平打印而不是垂直打印: 至 我不确定该如何做,会有一些帮助。谢谢 问题答案: 两种选择: 累加一个结果字符串,最后是: 或者告诉Python不要用换行符结束打印的字符串。在您似乎正在使用的Python 3中,您可以通过设置函数的参数(默认情况下为(换行符))来实现此目的: 历史记录:在Python 2中,可以通过在语句末尾添加逗号来实现。