【问题标题】:Copy class but overwrite the existing class imports复制类但覆盖现有的类导入
【发布时间】:2020-10-13 17:50:33
【问题描述】:

我有一个已有导入的类:

import org.packageA.Peeler

public class Potato {

    Peeler peeler = new Peeler();

}

我希望能够复制这个类或用它创建一个对象,但将“import org.packageA.Peeler”更改为“import org.packZ.Peeler”。

这可以动态执行吗?

【问题讨论】:

  • 你的想法是什么?你想做什么?
  • 我有一个 Selenium 测试环境。我希望能够在导入时设置的不同参数下运行所有​​测试方法。我可以看到,这些类中的测试方法的编写方式是更改导入的唯一替代方法是复制数十个类文件,然后对更改后的导入进行硬编码。也许还有另一种选择。

标签: java import


【解决方案1】:

没有。

import 语句有点用词不当。 import com.foo.A; 表示:任何时候我在这个源文件中只写A,想象一下我写了com.foo.A,这就是它的全部含义。这并不意味着:初始化这个类或解析这个源文件或任何其他类似的东西(这通常是 import 在其他环境中的意思)。

因此,您要问的是:我可以采用class Potato { org.packA.Peeler peeler = new org.packA.Peeler(); } 并以某种方式动态创建一个不同的土豆类,就好像我写了class Potato { org.packA.Peeler peeler = new org.packA.Peeler(); } - 答案是否定的; org.packA.Peelerorg.packZ.Peeler 的关系就像枪支和祖母一样(即:它们具有相同的名称并不重要)。

即使你可以,那意味着什么? Java 是静态和名义上的类型,如果不使用反射或动态代码生成,就不可能编写引用这个重写的土豆类的代码,无论如何,在 java 中,这几乎总是错误的答案。

你确实有一些奇特的选择:

  1. 使用正则表达式或构建脚本插件制作应用了一些重命名的源文件,并将其包含在构建和编译过程中(坏主意,但我想你可以这样做)
  2. 使用 ASM、BCEL 或其他类文件工具以应用重命名的字节数组形式创建新类文件,使用自定义类加载器动态加载它,然后生成使用它的字节码,或使用反射访问。这非常复杂,需要大量代码,而且几乎没有用处。

也许退后一步,解释一下让你思考的问题:我知道!我将动态重写这个类以使用不同的包!但我不知道怎么做,所以我会问——除非你问错了问题,否则问问你原来的问题。

【讨论】:

  • 我有一个 Selenium 测试环境。我希望能够在其导入中设置的不同参数下运行所有​​测试方法。我可以看到,这些类中的测试方法的编写方式是更改导入的唯一替代方法是复制数十个类文件,然后对更改后的导入进行硬编码。也许还有另一种选择。
  • 当然有;可以使用参数化测试,将相关类作为参数传入,测试代码可以使用反射动态加载正确的剥离器。
猜你喜欢
  • 2018-04-24
  • 2014-12-26
  • 2014-01-08
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多