目标
我有一个项目a,我不想修改它的源代码。我想";合并";它与项目B在建,这样:
- B中的类替换A中的类
- 在A中被替换的任何类都会被移动。B中的类可以保持从这些类继承
这样做的目的是能够";劫持;通过包装方法(在某些实例中,将它们全部替换在一起)在项目A中的行为,而不必在项目A源代码中这样做。
示例
给定项目a中在名称空间org.bar
下的类Foo
,我们有一个类
public class Foo extends org.bar.Foo {
@Override
public void doThings() {
// doOtherThings
super.doThings();
// doEvenMoreThings
}
}
在项目B中,它将被项目A中的其他代码调用,而不是原始的Foo
类。
我的问题/我尝试了什么
我解决这个问题的想法是创建一个项目a s.t的阴影jar。除了要修补的类之外,所有类都将移动到与项目B的命名空间匹配的新命名空间,然后将两者合并。然而,我无法在项目A.中修补对这些类的引用
我所面临的问题是将对原始类的任何命名空间引用替换为修补类;"父";修补类中的引用。任何这样做的尝试都会导致java在运行时抱怨引用被丢弃(这是几个月前的事了,我没有错误日志)。
也许这是AOP,面向方面编程的情况。它可以拦截呼叫并提供自己的过滤功能。
这既是一个棘手的补丁,而不仅仅是重写代码。但是您可以在旧代码中返回您的子类实例,当最初返回它们的基类实例时。
Baeldung谈Spring的AOP
这是否可行取决于。