有没有办法在运行时将方法动态分配给Java类?
考虑这个基类:
public class Cat {
public void meow() {
// meowing
}
}
出于某种原因,cats子类不能从这个Cat
类继承,因为它们必须从另一个基类继承,而Java不支持多重继承。因此:
public class Cat1 extends BaseClass1 {
}
public class Cat2 extends BaseClass2 {
}
public class Cat3 extends BaseClass3 {
}
如何动态地扩充CatX
类的实例以从Cat
类继承meow
方法
伪代码可能是:
public cat1Instance = new Cat1();
Cat.augmentWithCatBehavior(cat1Instance);
我有办法做到这一点吗
更新:作文不是我想要的。对于合成,我需要在所有的Cat1
到CatN
类中有一个Cat
类的实例。我必须在每个类中创建一个包装器方法,以便调用meow
。这是大量的样板代码。这就是为什么我说动态增强
# 1 楼答案
你不能这样做,但你有两个选择可以探索
使用接口时,最好使用继承来指定行为,而不是使用继承
第二种选择是使用函数式编程从方法返回使用者实例,该方法可以根据某些逻辑条件进行更改
注:函数编程使我们能够返回函数/行为,这对我们有很大帮助
# 2 楼答案
使用Cat类的
interface
而不是class
,并将方法设为默认值。仅适用于Java8及更高版本您可以按如下方式调用子类的方法:
# 3 楼答案
不,Java类的结构在编译时是固定的,并且只能检查(使用反射),但不能在运行时动态更改
不过,在运行时可以动态地generate整个类。尽管这大大违背了使用静态编译语言(如Java)的目的
另一个答案是研究AOP,Java在某些框架(例如SpringAOP)中支持它。这里的想法是确定“横切”关注点,并让框架以某种方式添加相应的代码。一个典型的例子是对方法进行“注释”以进行“日志记录”,然后AOP框架只添加进行一些标准化日志记录所需的代码
# 4 楼答案
不能在运行时向类添加方法。您有两种可能的解决方案: