有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

有没有办法在运行时将方法动态分配给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);

我有办法做到这一点吗

更新:作文不是我想要的。对于合成,我需要在所有的Cat1CatN类中有一个Cat类的实例。我必须在每个类中创建一个包装器方法,以便调用meow。这是大量的样板代码。这就是为什么我说动态增强


共 (4) 个答案

  1. # 1 楼答案

    你不能这样做,但你有两个选择可以探索

    1. 使用接口时,最好使用继承来指定行为,而不是使用继承

    2. 第二种选择是使用函数式编程从方法返回使用者实例,该方法可以根据某些逻辑条件进行更改

    注:函数编程使我们能够返回函数/行为,这对我们有很大帮助

  2. # 2 楼答案

    使用Cat类的interface而不是class,并将方法设为默认值。仅适用于Java8及更高版本

    interface Cat {
       default void meow() {
        // meowing
       }
    }
    public class Cat1 extends BaseClass1 implements Cat {
        @Override public void meow() {}
    }
    

    您可以按如下方式调用子类的方法:

    Cat cat= new Cat1();
    cat.meow();
    
  3. # 3 楼答案

    不,Java类的结构在编译时是固定的,并且只能检查(使用反射),但不能在运行时动态更改

    不过,在运行时可以动态地generate整个类。尽管这大大违背了使用静态编译语言(如Java)的目的

    另一个答案是研究AOP,Java在某些框架(例如SpringAOP)中支持它。这里的想法是确定“横切”关注点,并让框架以某种方式添加相应的代码。一个典型的例子是对方法进行“注释”以进行“日志记录”,然后AOP框架只添加进行一些标准化日志记录所需的代码

  4. # 4 楼答案

    不能在运行时向类添加方法。您有两种可能的解决方案:

    1. 使用接口解决多重继承的需要
    2. 使用实例字段和组合而不是继承