好的,标题有点神秘,一个例子会更好地表达我的意思,假设以下结构:
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();
}
}
此代码已大大简化,类A
,B
和C
显然实现了methodCall()
,但没有必要在代码中明确显示。
我想问的是以下内容:
有没有办法告诉Java 生成我的doSomeMainMethod
方法?我想告诉Java在类methodCall()
中I
类型的所有对象上调用Main
。
最好不使用反射,因为我认为有可能或者如果需要反射,是否有办法将它包起来使它至少看起来不是hackish?当然,它需要安全(尽可能安全)。
答案 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);
}
}