wil*_*ilx 1 java reflection facade
我在一个巨大的产品中有一堆我不想使用的类,而是我想将它们的用途重定向到不同的类.这些类(和接口)主要是日志记录类.例如,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来生成实现并使用重新分解,例如用委托替换继承.这将生成您需要的外墙,而无需额外的工具.
例如,假设你需要一个Map的包装器(这个工作的IntelliJ,但其他也可以这样做)
class MyMap<K,V> extends Map<K,V> { // this doesn't compile but can be refactored
Run Code Online (Sandbox Code Playgroud)
如果我做"用委托替换继承"我得到一个编译的包装器
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
}
Run Code Online (Sandbox Code Playgroud)
现在说我想从不同的包中获取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.
}
Run Code Online (Sandbox Code Playgroud)
注意:内联后,甚至不会有明显的性能损失.