Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码反射和faç的生成;用于重定向类的ADE_Java_Reflection_Facade - Fatal编程技术网

Java代码反射和faç的生成;用于重定向类的ADE

Java代码反射和faç的生成;用于重定向类的ADE,java,reflection,facade,Java,Reflection,Facade,我在一个巨大的产品中有一堆我不想使用的类,相反,我想将它们的使用重定向到不同的类。这些类(和接口)主要是日志类。例如,org.apache.log4j类(很久以前)被获取并以不同的包名导入到源代码中,比如foo.org.apache.log4j 现在,我想使用一些使用这些导入和重命名的类但没有这些导入和重命名的类的组件。这是因为导入的源代码很旧,并且缺乏功能,所以我无法按原样使用它。另外,有两个不同的log4j实现,旧的导入的和原始的log4j,会在配置过程中产生问题,等等 到目前为止,我的作战

我在一个巨大的产品中有一堆我不想使用的类,相反,我想将它们的使用重定向到不同的类。这些类(和接口)主要是日志类。例如,
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来生成实现,并使用重分解,比如用委托代替继承。这将在不使用其他工具的情况下生成所需的外观

e、 g.假设你需要一个地图包装器(这个可以工作的IntelliJ,但其他人也可以这样做)

类MyMap扩展了Map{//这不会编译,但可以重构
如果我“用委托替换继承”,我会得到一个可以编译的包装器

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
}
classmymap{
私人地图;
public V get(K key){返回map.get(key);}
//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.
}
MyMap类实现了somepackage.Map{ 私有some.other.pkg.Map地图; //我需要的所有授权方法。 //根据需要定制。 }
注意:内联后,甚至不会有显著的性能损失。

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

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

e、 g.假设你需要一个地图包装器(这个可以工作的IntelliJ,但其他人也可以这样做)

类MyMap扩展了Map{//这不会编译,但可以重构
如果我“用委托替换继承”,我会得到一个可以编译的包装器

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
}
classmymap{
私人地图;
public V get(K key){返回map.get(key);}
//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.
}
MyMap类实现了somepackage.Map{ 私有some.other.pkg.Map地图; //我需要的所有授权方法。 //根据需要定制。 }
注意:内联后,甚至不会有显著的性能损失。

好的,为什么要进行接近投票?这个问题有什么问题吗?我不是进行接近投票的人,但这可能是因为您的问题措辞要求“库或工具”在开始谈论反思之后。好吧,为什么要投反对票?这个问题有什么问题吗?我不是投反对票的人,但这可能是因为你在开始谈论反思之后问了一个“库或工具”。20节课以下的任何课程都可以替换(如果我们说的是像log4j这样的库,情况就是这样)这似乎是最简单的解决方案。对于任何小于20个类的对象来说(如果我们说的是像log4j这样的库,情况就是这样),这似乎是最简单的解决方案。