我们这里(两个小团队)正在编写一个Android库(基于OpenGL ES 3.1的图形效果库,但这与问题无关)。一个团队编写Core部分(此代码最终在(* .library.core包)中,而另一个团队编写单独的效果(每个效果是* .library.effects包中的单个.java文件+一些着色器代码)。
目前开发的工作原理如下:每次编写一个新的效果时(假设实现它的类称为EffectBlahBlah),核心团队必须检查其代码,并在一个地方添加一个调用静态方法EffectBlahBlah.init(),在另一个地方 - 调用另一个静态方法EffectBlahBlah.getUniforms()等等。有AFAIK 7个不同的地方,我们必须添加7个不同的调用到某些(静态和非静态)来自新效应的方法。
现在 - 必须添加7行代码并不是世界末日;然而(特别是考虑到我们希望向外部程序员开放效果部分的事实),我们希望通过以下方式自动化这个:
现在,如果不是静态方法(必须在那里)我知道如何做到这一点:让所有的效果扩展一个抽象类(比如说'BaseEffect'),它在每个方法中声明了7个方法的抽象7个地方使用Class.forName()在循环中实例化每个效果,将其强制转换为BaseEffect并调用适当的方法。
然而,Java不允许抽象方法是静态的。那你推荐什么?
答案 0 :(得分:1)
您可以使用反射。一个可能的调用序列大致是:
Class.forName(name)
获取描述您班级的Class
实例。getMethods()
实例上调用Class
以获取方法列表(或getMethod()
直接获取方法,如果您可以弄清楚如何使用它。)Method
个实例列表中的条目,请使用getModifiers()
检查其是否为静态,并getName()
标识特定方法。Method
实例后,调用其上的invoke()
方法来调用该方法。对于静态方法,您可以使用null
作为接收者(第一个参数)。