Java元编程

efr*_*itz 11 java metaprogramming dynamic

我正在使用Java开发我的第一个真正的项目.尽管我对动态语言有更多的经验,但我开始对这门语言感到满意.

我有一个类似于以下的类:

class Single
{
    public void doActionA() {}
    public void doActionB() {}
    public void doActionC() {}
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个SingleList类充当这些类的集合(具体来说,它是用于2D Sprite库,而"actions"是各种变换:旋转,剪切,缩放等).我希望能够做到以下几点:

class SingleList
{
    public void doActionA() {
        for (Single s : _innerList) {
            s.doActionA();
        }
    }

    ... etc ...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法简单地将方法(或已知的方法列表)推迟到内部列表的每个成员?无需专门列出每个方法的任何方式,然后遍历每个内部成员并手动应用它?

为了使事情变得更难,方法是不同的arity,但都是返回类型"void".

thk*_*ala 11

遗憾的是,Java并不支持在运行时创建类,这正是您所需要的:SingleList需要使用必要的存根方法自动更新以匹配Single类.

我可以想到以下方法来解决这个问题:

  1. 使用Java反射:

    • 优点:
      • 它以Java语言提供,您可以轻松找到文档和示例.
    • 缺点:
      • SingleList类不会与兼容Single类的接口了.
      • Java编译器和任何IDE通常无法帮助通过反射调用的方法 - 编译器捕获的错误通常会转换为运行时异常.
      • 根据您的使用情况,您可能还会看到明显的性能下降.
  2. 使用构建系统以及某种源代码生成器来自动创建SingleList.java文件.

    • 优点:
      • 设置完成后,您将不再需要处理它.
    • 缺点:
      • 设置它有一定的难度.
      • 您必须单独确保SingleList在任何JVM(或您的IDE)中加载的Single类实际上与加载的类匹配.
  3. 手动解决这个问题 - 创建一个接口(例如SingleInterface)或基类抽象类供两个类使用应该有所帮助,因为任何体面的IDE都会指出未实现的方法.适当的类架构可以最大限度地减少重复的代码,您的IDE可能有助于生成样板部件.

    • 优点:
      • 没有设置曲线可以克服.
      • 您的IDE将始终看到正确的类集.
      • 之后通常会改进类体系结构.
    • 缺点:
      • 一切都是手动的.
  4. 使用字节码生成库(如JavassistBCEL)动态生成/修改SingleList类.

    • 优点:
      • 这种方法非常强大,从长远来看可以节省大量时间.
    • 缺点:
      • 使用字节码生成库通常不是微不足道的,适合胆小的人.
      • 根据您编写代码的方式,您可能还会遇到IDE及其动态类处理问题.