【问题标题】:How to specify the path of a .class file to be dynamically loaded in its filesystem?如何指定要在其文件系统中动态加载的 .class 文件的路径?
【发布时间】:2020-03-16 18:16:22
【问题描述】:

当java程序动态加载.class文件时,

  • 是否只需要 .class 文件的完全限定类名? ClassLoader s方法loadClass()只需要动态加载.class文件的全限定类名?

  • 如果 .class 文件可以位于文件系统中的任何位置,我如何在其文件系统中指定其路径名?

  • 当使用命令java 运行从Java 程序创建的字节码时,我是否需要在-cp 中指定要动态加载的.class 文件的路径?

谢谢。

【问题讨论】:

    标签: java dynamic-loading


    【解决方案1】:

    您将类和“.class”文件混为一谈。

    是否只需要 .class 文件的全限定类名? ClassLoader的方法loadClass()是否只需要动态加载.class文件的全限定类名?

    类的完全限定类名是必需的。

    如果 .class 文件可以位于文件系统中的任何位置...

    不可能!类对应的 .class 文件需要在相关类加载器的类路径中。

    如果你想从文件系统中的任意文件加载一个类,你需要创建一个新的类加载器实例:

    • 如果您使用标准类加载器实现之一,它将使用标准方案根据类包名称解析 .class 文件位置。

    • 可以实现一个自定义类加载器,将 FQ 类名解析为文件系统对象……其他方式。但这似乎没有必要,因为标准 Java 编译器会按照标准方案发出 .class 文件。

    当使用命令java运行从Java程序创建的字节码时,我是否需要在-cp中指定要动态加载的.class文件的路径?

    您没有提供 .class 文件的位置。您提供可以解析 .class 文件的目录的位置,如上所述。

    但是如果一个正在运行的 Java 程序生成、编译然后加载一个类,它需要动态地创建一个新的类加载器来可靠地加载它。

    为什么?因为类加载器通常会在类路径上缓存目录和 JAR 索引的内容。所以当一个程序写入一个新文件时,类加载器可能不会知道它。

    还有一个问题是类加载器不能两次加载同一个类(从任何位置)。

    最后,请注意,如果两个类加载器加载具有相同完全限定名称的类,运行时类型系统会将它们视为不同的类/类型。您不能在该类型的两个化身之间进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多