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.
}
注意:内联后,甚至不会有明显的性能损失。
我不想使用大型产品中的一堆 类,而是想将它们的用途重定向到不同的 类。这些 类(和接口)主要是记录 类。例如,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.
}
注意:内联后,甚至不会有明显的性能损失。