【问题标题】:Java code reflection and generation of façades for redirection of classes用于重定向类的 Java 代码反射和外观生成
【发布时间】:2015-02-23 11:31:24
【问题描述】:

我不想使用大型产品中的一堆类,而是想将它们的用途重定向到不同的类。这些类(和接口)主要是日志类。例如,org.apache.log4j 类(很久以前)被采用并以不同的包名称导入到源中,例如 foo.org.apache.log4j

现在,我想使用一些使用这些导入和重命名的类但没有这些导入和重命名的类的组件。这是因为导入的源是旧的并且缺乏功能,所以我不能按原样使用它。此外,有两种不同的 log4j 实现,旧的导入的和原始的 log4j,在配置过程中会产生问题,等等。

到目前为止,我的战斗计划是排除 pom.xml 中不受欢迎的依赖项,并以某种方式 自动生成 外观,这些外观将替换不受欢迎的类并重定向到原始库。例如,foo.org.apache.log4j.Logger 将被替换为继承自 org.apache.log4j.Logger 的外观。

现在,是否有任何类型的库或工具可以轻松遍历foo.org.apache.log4j 定义的所有现有类并允许我生成这些外观,还是我必须使用反射自己实现所有内容?

【问题讨论】:

  • 好的,为什么要关闭投票?这个问题有什么问题?
  • 我不是投赞成票的人,但这可能是由于您在开始谈论反思之后如何措辞要求“库或工具”。

标签: java reflection facade


【解决方案1】:

我不会使用工具来生成这些类,因为它是一次性的。

相反,我会使用 IDE 生成实现并使用重构,例如用委托替换继承。这将生成您需要的外观,而无需额外的工具。

例如假设你需要一个 Map 的包装器(这个工作的 IntelliJ,但其他人也可以这样做)

class MyMap<K,V> extends Map<K,V> { // this doesn't compile but can be refactored

如果我执行“用委托替换继承”,我会得到一个可以编译的包装器

class MyMap<K,V> {
   private Map<K,V> map;

   public V get(K key) { return map.get(key); }

   // all the methods of map have been wrapped
}

现在说我想要来自不同包的地图,但使用 smae 签名,我可以更改导入,它将使用不同的地图包

class MyMap<K,V> implements somepackage.Map<K,V> {
    private some.other.pkg.Map<K,V> map;
    // all the delegation methods I need.
    // customise them as required.
}

注意:内联后,甚至不会有明显的性能损失。

【讨论】:

  • 对于 20 个以下的类要替换的任何东西(如果我们谈论像 log4j 这样的库就是这种情况),这似乎是最简单的解决方案。
猜你喜欢
  • 2014-05-19
  • 2012-05-04
  • 2011-02-07
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多