有一个库具有执行某些任务的基类(我们称其为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/