运行时:检测给定包中的所有类,并为找到的每个类调用某些方法(静态和非静态)

时间:2015-01-05 16:51:34

标签: android

我们这里(两个小团队)正在编写一个Android库(基于OpenGL ES 3.1的图形效果库,但这与问题无关)。一个团队编写Core部分(此代码最终在(* .library.core包)中,而另一个团队编写单独的效果(每个效果是* .library.effects包中的单个.java文件+一些着色器代码)。

目前开发的工作原理如下:每次编写一个新的效果时(假设实现它的类称为EffectBlahBlah),核心团队必须检查其代码,并在一个地方添加一个调用静态方法EffectBlahBlah.init(),在另一个地方 - 调用另一个静态方法EffectBlahBlah.getUniforms()等等。有AFAIK 7个不同的地方,我们必须添加7个不同的调用到某些(静态和非静态)来自新效应的方法。

现在 - 必须添加7行代码并不是世界末日;然而(特别是考虑到我们希望向外部程序员开放效果部分的事实),我们希望通过以下方式自动化这个:

  1. 让Core扫描* .library.effect包并提出一个 所有效果类的列表(我们知道如何做)
  2. 在我们代码中的每7个地方,自动调用 每个发现的类的适当方法。
  3. 现在,如果不是静态方法(必须在那里)我知道如何做到这一点:让所有的效果扩展一个抽象类(比如说'BaseEffect'),它在每个方法中声明了7个方法的抽象7个地方使用Class.forName()在循环中实例化每个效果,将其强制转换为BaseEffect并调用适当的方法。

    然而,Java不允许抽象方法是静态的。那你推荐什么?

1 个答案:

答案 0 :(得分:1)

您可以使用反射。一个可能的调用序列大致是:

  1. 使用Class.forName(name)获取描述您班级的Class实例。
  2. getMethods()实例上调用Class以获取方法列表(或getMethod()直接获取方法,如果您可以弄清楚如何使用它。)
  3. 对于返回的Method个实例列表中的条目,请使用getModifiers()检查其是否为静态,并getName()标识特定方法。
  4. 找到所需的Method实例后,调用其上的invoke()方法来调用该方法。对于静态方法,您可以使用null作为接收者(第一个参数)。