有一个库具有执行某些任务的基类(我们称其为CBase),并且可以创建扩展此CBase类的类。

CBase的行为对我来说还不够,因此我想创建自己的CBase类(我们称其为MyCBase),它们具有相同的方法和成员,但这些方法不能做相同的事情。

到现在为止一切正常。但是让我受阻的是我想用MyCBase代替CBase。但是,我有很多扩展CBase的类,并且我不想全部更改。

是否可以在运行时用MyCBase替换CBase?
以便

public class A extends CBase {}


变成

public class A extends MyCBase {}


我可以使用代码增强功能执行此操作吗? (就像我们在运行时在类中添加方法一样。是否也可以通过这种方式更改继承?)

谢谢您的帮助 !

编辑

我想为框架编写一个插件,这就是为什么我想在运行时更改继承。这样,框架的用户可以使用我的插件而无需更改其源代码(将其类的继承从CBase更改为MyCBase)

编辑2

是否可以这样做:

CtClass cc = CtClass.forName("pkg.AClass");
cc.setSuperclass(CtClass.forName("mylib.MyCBase"));
cc.compile();

最佳答案

我不是专家。可能您可以扩展ClassLoader。但我强烈建议您不要这样做。替换将涉及您的许多类,但在代码读取和应用执行中将很明显。

我认为还有很多改进架构的空间,因为您有很多扩展CBase的类。人们正在尝试从其他库中删除依赖项或将其保持很小。因为在这种情况下,您可以轻松切换到另一个库或添加自己的功能。

关于java - 使一个类在运行时扩展另一个类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11646035/

10-11 10:43