在不修改源代码的情况下,用子类修补另一个项目中的java类



目标

我有一个项目a,我不想修改它的源代码。我想";合并";它与项目B在建,这样:

  1. B中的类替换A中的类
  2. 在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

这是否可行取决于。

相关内容

  • 没有找到相关文章