0

我正在用 Java 实现一种 ORM。我正在尝试做一个仅在父类中的静态查找方法。让我进入正题:

public class DB {
  public static Object find (int id) {
    // i want to return anew instance of the calling subclass
  }
}

public class Item extends DB {
  // nothing here
}

public class Test {
  public static void main () {
    Item i = (Item) Item.find(2);
    ...
  }
}

我不知道如何让 find 方法知道它的哪个继承类正在调用它,以便我可以返回正确的实例(并且可能调用正确的构造函数等)并且继承的类可以是任何东西,没有限制.

我试过stacktrace,但它只从Test跟踪到DB。

有任何想法吗?

谢谢大家!

4

3 回答 3

2

静态方法不是继承的,所以你不能这样做。解决此问题的一种常见方法(不包括使用大量可用的 ORM 解决方案)是将您的类层次结构分成两部分:

  • “实体”(例如代表您的实际数据的类)
  • 和“DAO”(数据访问对象)——包含操作数据持久性方法的类。
于 2009-11-20T22:06:15.043 回答
1

智者的话:尝试实现自己的 ORM 可能是个坏主意。像hibernate这样的项目已经非常详细地涵盖了这个任务,所以如果你自己动手,你可能会重新发明轮子,并可能尝试解决已经解决的问题。

关于主题的更多信息,ChssPly76 是正确的,因为您无法完成此操作,因为 Java 中如何处理静态方法。当 VM 加载静态方法调用的字节码时,它将执行查找以查找方法实际位于的位置。它不会在Item课堂上找到它,因此它将调用绑定到DB.find.

然而!可能有可能通过一些字节码争论来实现你想要做的事情。在您的示例中查看静态方法调用的字节码(使用javap -c),我们得到以下信息:

invokestatic Method Item.find:(I)Ljava/lang/Object

因此,一旦您的调用到达DB.find,您可以按照堆栈跟踪返回调用站点,然后检查调用站点的字节码以检索调用的实际目标。理论上,无论如何,因为我自己在实践中还没有看到这一点。另外,请注意不要像这样破解字节码,因为这里是龙。

感谢识别活动记录模式,并希望在 Java 中使用它。我同意这是一种比 Java 中的大多数数据库访问模式更有意义的设计模式,它是 Ruby 和 PHP 的优势之一。

于 2009-11-20T22:48:13.323 回答
0

我认为您可能会发现 IBM developerworks 上的“ Generic DAO ”文章很有用。

简而言之:明智地使用泛型。

于 2009-11-20T22:06:38.600 回答