Java 用于重定向 类 的代码反射和外观生成

Java code reflection and generation of façades for redirection of classes

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

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

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

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

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

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

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

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

如果我这样做 "Replace inheritance with delegation" 我会得到一个可以编译的包装器

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
}

现在说我想要来自不同包的 Map,但是有了 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.
}

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