Java Class.forName()与直接类加载

Java Class.forName()与直接类加载,java,class,Java,Class,我发现一些代码加载资源是这样的: Class.forName(myClass.class.getName()).getResourceAsStream("myResource"); 首先,我想知道使用这种结构的兴趣。它显示为Class.forName(“className”)启用动态加载,仅在需要时加载类(例如,这是加载JDBC驱动程序时的典型结构) 然而,在这种情况下,动态加载不是效率低下吗,因为类是在代码中的?如果我写了以下内容,会有什么不同吗 myClass.class.getResou

我发现一些代码加载资源是这样的:

Class.forName(myClass.class.getName()).getResourceAsStream("myResource");
首先,我想知道使用这种结构的兴趣。它显示为
Class.forName(“className”)
启用动态加载,仅在需要时加载类(例如,这是加载JDBC驱动程序时的典型结构)

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

myClass.class.getResourceAsStream("myResource");

mmyClass.class.getResourceAsStream(“myResource”)应该是首选选项,因为它不进行搜索。结果是一样的,因为
myClass.class.getName()
用于
forName
,而不仅仅是预定义的字符串。

您的问题写起来没有多大意义
Class.forName
Class.getResourceAsStream
正在做不同的事情。它们可以互换

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

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


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

在这种情况下,动态类加载肯定是一种浪费。是的。第二个有更好的性能
myClass.class
是我们正在寻找的
class
对象。无需从该实例中查找名称,也无需要求
Class
以该名称再次查找该名称……如果您再次阅读该问题,您将看到我知道如何使用
getResourceAsStream
。然而,在调用此方法之前,我对类的加载方式表示怀疑:我不确定
class.forName(myClass.class.getName())
的构造是否有意义或有趣,之前的注释和答案似乎与我的感觉相符。