【问题标题】:Possible to use two java classes with same name and same package?可以使用两个具有相同名称和相同包的 java 类吗?
【发布时间】:2011-10-16 07:37:13
【问题描述】:

是否可以在java中导入和使用两个同名同包的不同类?

例如,假设我有两个名为“com.foo.Bar”的类,它们略有不同。我希望能够同时使用两者,但我有一个限制(因为愚蠢的反射废话),这迫使我保持​​名称和包相同。

是否有 java 的某些功能可以让我导入和隔离这些类中的每一个?

为了详细说明,我更改了我的 avro 模式,它们不应该被更改(哎呀!),现在我想返回并更改无法用我的新模式读取的旧 avro 文件架构到我的新架构可以读取的文件中。 Avro 似乎强制您使用特定的类和包名称来加载文件。

【问题讨论】:

  • 如果顶级类型的名称显示为同一包中声明的任何其他顶级类或接口类型的名称,则会出现编译时错误。

标签: java


【解决方案1】:

是的。不过,它确实需要您制作自己的 ClassLoader

我在 github 上做了一个demo 到!

【讨论】:

    【解决方案2】:

    如前所述,编写您自己的类加载器或另外使用像 Equinox 这样的 OSGi 框架来为您进行类加载

    【讨论】:

      【解决方案3】:

      不,使用 java 包正是为了避免这个问题。

      【讨论】:

      • 我认为包装类的想法不会奏效。设 2 个同名类为 C1 和 C2;以及它们各自的包装器 W1 和 W2。类加载器将 (1) 加载 W1,这将导致它 (2) 加载 C1。然后类加载器将 (3) 加载 W2。它会认为它已经加载了 C2(因为名称相同)并且您的 W2 类将包装 C1。
      【解决方案4】:

      在我看来,您需要在名为 com.foo.Bar 的接口中定义您的方法签名。然后提供接口的两种不同的具体实现(例如,com.foo.DefaultBar 和 com.foo.SpecialBar)。这样,您可以针对接口类型进行编程,并根据需要在两种不同的实现之间切换。

      您能否详细说明“反光垃圾”是什么意思?这可能有助于深入了解您的确切问题。

      不要弄乱类加载器或任何其他低级技巧。解决此类问题的最佳方法是首先要有一个任何人都可以理解的清晰设计。

      【讨论】:

      • 我们以应有的方式更改了 avro 架构,因此我正在尝试编写一个 hadoop 作业来修复使用旧架构的文件。 Avro 似乎强迫你使用相同的类和包名。
      【解决方案5】:

      是的,有。您需要实现自己的 Classloader 并玩一些游戏才能在运行时访问两者。

      我确信这是可能的,因为我遇到了一个非常难以调试的问题,有人在他们的产品中有一个奇怪的类加载器,它搞砸了加载库并提供来自 2 个不同版本的同一文件的 2 个不同版本图书馆。

      但是,这听起来像一个难以置信的坏主意。我会回去寻找解决您问题的不同方法。从长远来看,这只会给你带来心痛。哎呀,当您研究类加载器时,它可能已经是了。

      编辑:具体而言,您不能同时“导入”两者。但您可以在运行时访问两者。

      【讨论】:

      • 我认为你只需要尽可能多的单独的类加载器实例(其中一个可以是引导类加载器),因为你想要引用同名的类。您实际上不需要为此编写自己的类加载器。
      【解决方案6】:

      如果你真的非常必须做这样的事情,你可以通过使用不同的类加载器和可能的反射来实现它。

      这不是 Java 的工作方式,也不允许故意这样做 - 你不应该做愚蠢的事情,这会让你搞砸。

      【讨论】:

        【解决方案7】:

        从技术上讲,它可以使用一些低级技巧来完成,例如重写字节级代码。据我所知,不同的 java crypter/encrypters 是这样工作的——它们有很多名为 A.class B.class C.class 等的类。

        【讨论】:

        • 它不一定是低级或诡计。单独的类加载器实例是要走的路。
        【解决方案8】:

        Java 中没有命名空间,只有 C# 中,所以我假设您的意思是包。每个项目只能有一个完全限定名称。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-20
          • 2011-06-01
          • 1970-01-01
          • 2014-01-12
          • 2017-03-04
          • 2017-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多