特定类型的所有对象上的Java调用方法

时间:2014-01-25 11:34:33

标签: java

好的,标题有点神秘,一个例子会更好地表达我的意思,假设以下结构:

interface I { 
    methodCall();
}

class A implements I {
}

class B implements I {
}

class C implements I {
}

class Main {
    private A a;
    private B b;
    private C c;

    //other interesting stuff

    void doSomeMainMethod() {
        a.methodCall();
        b.methodCall();
        c.methodCall();
    }
}

此代码已大大简化,类ABC显然实现了methodCall(),但没有必要在代码中明确显示。

我想问的是以下内容:
有没有办法告诉Java 生成我的doSomeMainMethod方法?我想告诉Java在类methodCall()I类型的所有对象上调用Main

最好不使用反射,因为我认为有可能或者如果需要反射,是否有办法将它包起来使它至少看起来不是hackish?当然,它需要安全(尽可能安全)。

3 个答案:

答案 0 :(得分:0)

class Main {
private A a;
private B b;
private C c;
private I[] instances = new I[]{a, b, c};

//other interesting stuff

void doSomeMainMethod() {
    for(I instance : instances) {
        instance.methodCall();
    }
}

答案 1 :(得分:0)

如果要生成方法,则可以使用ASM生成或(可能更简单的选项)实现自己的AnnotationProcessor。使用第二个选项,您应该注释类,然后在编译时扫描这个注释并生成decired方法。

答案 2 :(得分:0)

interface I {
  void methodCall();
  List<I> INSTANCES = new ArrayList<I>();
}

现在,在实现接口I的每个类的构造函数中,执行以下操作:

I.INSTANCES.add(this);

主要:

for (I i : I.INSTANCES) {
  // do something with every instance of I
}

修改 这将添加I的所有实例。为了限制它在Main中创建的对象,让我们添加一个参数createdBy。它不是很优雅,但它只是Java,没有反思......

public A(Class createdBy) {
  if (createdBy.equals(Main.class) {
    I.INSTANCES.add(this);
  }
}