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

使用ClassLoader和Class.forName加载类之间的区别

融建树
2023-03-14
问题内容

以下是2个代码段

第一个使用ClassLoader类加载指定的类

ClassLoader cls = ClassLoader.getSystemClassLoader(); Class someClass = cls.loadClass("TargetClass");

第二个使用Class.forName()加载指定的类

Class cls = Class.forName("TargetClass");

上述方法之间有何区别?哪一个服务于哪个目的?


问题答案:

快速解答(无代码示例)

使用显式ClassLoader cls = <a ClassLoader>;方法,您可以灵活地从 不是
默认ClassLoader的ClassLoader中加载类。在你的情况下,你使用的是默认系统类加载器,所以它提供了类似的总体结果(与最终目标的差异的实例化)作为Class.forName(String name)呼叫,但你 可以 参考另一个类加载器来代替。

也就是说,Class.forName(String name, boolean initialize, ClassLoader loader)只要知道ClassLoader是什么,就可以使用。

例如,您的基于EAR的应用程序具有自己的ClassLoader,其中包含包装在其中的XML解析库的版本。您的代码通常使用这些类,但是在一个实例中,您需要从该库的早期版本中获取一个反序列化类(Application
Server恰好保留在 整体ClassLoader中)。因此,您可以改为引用该Application Server ClassLoader。

不幸的是,直到获得项目Jigsaw(JDK 8)为止,此方法的使用频率比我们想要的要高:-)



 类似资料:
  • 问题内容: 我们可以通过3种方法获得Class类对象: MyClass.class obj.getClass Class.forName(“ className”) 我不了解:和之间的区别。 因为两者都需要类名。 问题答案: forName是“类”类的静态方法。我们需要提供所需类别的完全限定名称。当在运行时知道类名时可以使用此方法。 .class不是方法,它是关键字,可以与int之类的原始类型一起

  • 问题内容: 和之间有什么区别? 我不了解其中的重大区别(我已经阅读了一些有关它们的信息!)。请你帮助我好吗? 问题答案: 也许一个示例演示如何使用两种方法将有助于你更好地理解事物。因此,请考虑以下类: 如其javadoc中所述,调用将返回与具有给定字符串名称的类或接口关联的对象,即它返回受type变量影响的对象。 然后,调用创建该 对象表示的类的新实例。就像通过带有空参数列表的表达式实例化该类。换

  • 问题内容: 我想了解Class.forName(“ ClassName”)和ClassObject.getClass是否都返回该类的运行时实例。然后为什么在比较从这两个对象获得的结果Class对象时获取一个布尔值false(如果我们使用==或equals进行比较)。 我也想知道在类名上调用.class方法的确切用途。我读到它是在编译时等确定的,但目的是什么。Class.forName(“ Clas

  • 问题内容: 这个问题困扰了我一段时间。我必须在我的Java应用程序中加载几个文件,到目前为止,我工作的唯一方式是这样的: 但这是丑陋和可怕的。有一阵子我以为我在做这个工作: 但这由于某种原因不再起作用(我必须做些更改并且没有注意到。它返回null。 我应该使用getResource()而不是getSystemResource()(如果这样),为什么getSystemResource()是静态的却不

  • CLMAIN->clA(类A,$B)。$B是类a的内部类B。 从clMain创建具有指定url的新clA到包含类A(和类$B)的jar文件。然后通过CLA创建新对象A。 从X加载的另一个类通过接口执行对象a的方法没有问题。 然后,在该方法中,应该创建新对象$b,但它抛出. 在类A的构造函数中加载类$B可以解决以下问题:

  • 问题内容: 线程的上下文类加载器和普通类加载器有什么区别? 也就是说,如果和返回不同的类加载器对象,将使用哪一个? 问题答案: 每个类将使用其自己的类加载器来加载其他类。所以,如果引用则需要上的类加载器的类路径,或者它的父母。 线程上下文类加载器是当前线程的当前类加载器。可以从中的类创建对象,然后将其传递给拥有的线程。在这种情况下,如果对象要加载其自己的类加载器上不可用的资源,则需要直接使用。