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())
的构造是否有意义或有趣,之前的注释和答案似乎与我的感觉相符。