簡體   English   中英

Java對子類的靜態反射

[英]Java static reflection on subclasses

我正在用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。

有任何想法嗎?

謝謝大家!

靜態方法不會被繼承,因此您不能這樣做。 解決此問題的一種常見方法(不包括使用大量可用的ORM解決方案之一)是將您的類層次結構分為兩部分:

  • “實體”(例如代表您的實際數據的類)
  • 和“ DAO”(數據訪問對象)-包含用於操縱數據持久性的方法的類。

明智的一句話:嘗試實現自己的ORM可能不是一個好主意。 hibernate這樣的項目已經非常詳細地介紹了此任務,因此,如果您自己動手,很可能會重新發明輪子,並可能嘗試解決已經解決的問題。

關於主題的更多信息,ChssPly76是正確的,因為Java中如何處理靜態方法,因此您無法完成此操作。 當VM加載用於靜態方法調用的字節碼時,它將執行查找以查找該方法實際位於的位置。 它不會在Item類上找到它,因此它將調用綁定到DB.find

然而! 可能需要通過一些字節碼調整來實現您想要的功能。 在您的示例中查看用於靜態方法調用的字節碼(使用javap -c ),我們得到以下信息:

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

因此,一旦您的呼叫到達DB.find ,您就可以將stacktrace跟蹤回到呼叫站點,然后在呼叫站點檢查字節碼以檢索該呼叫的實際目標。 從理論上講,因為我自己在實踐中還沒有看到這一點。 另外,請注意不要像這樣入侵字節碼,因為這里有龍。

識別活動記錄模式並希望在Java中使用它的榮譽。 我確實同意,這是一種設計模式,比Java中大多數數據庫訪問模式更有意義,並且它是Ruby和PHP的優勢之一。

我認為您可能會在IBM developerWorks上找到“ Generic DAO ”文章。

簡短:明智地使用泛型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM