3

我以这种方式找到了一些代码加载资源:

Class.forName(myClass.class.getName()).getResourceAsStream("myResource");

首先,我想知道使用这种结构的兴趣。它似乎Class.forName("className")启用了动态加载,仅在需要时加载类(例如,这是加载 JDBC 驱动程序时的典型结构)。

然而,由于类在代码中,在这种情况下动态加载不是效率低下吗?如果我写以下内容会有什么不同吗?

myClass.class.getResourceAsStream("myResource");
4

2 回答 2

1

mmyClass.class.getResourceAsStream("myResource");应该是首选选项,因为它不进行搜索。结果是相同的,因为myClass.class.getName()在 中使用forName,而不仅仅是预定义的字符串。

于 2012-12-18T07:41:45.413 回答
0

你的问题写得没有多大意义。 Class.forName并且Class.getResourceAsStream正在做不同的事情。它们是可以互换的。

比较它们的唯一方法是,如果您正在比较加载一个充满(比如说)static用数据初始化的字段的类与读取包含相同数据的资源。如果这就是您所说的更好,那么该getResourceAsStream方法在许多方面都更好:

  • 您可以通过这种方式读取的数据量没有限制,
  • 您不必将数据嵌入“代码”中,
  • 你的内存占用会更小,
  • 您可以仅加载所需数据的子集,
  • 它可能更快,
  • 等等。

如果您问是否可以使用getResourceAsStream()来加载类(在正常意义上),答案是否定的。当然,您可以获得字节码,但您必须做“其他事情”才能将这些字节码转换为 JVM 中的可执行类/方法。

于 2012-12-18T07:51:25.813 回答