gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:42:42 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

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 签名,我可以更改导入,它将使用不同的 map 包

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.
}

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

关于用于类重定向的 Java 代码反射和外观生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28672785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com