2012-07-23 26 views
1

我的java有點生疏,我必須爲這個問題實現一個解決方案。Java棘手的繼承和調用類和方法

鑑於A.java其中:

public class A implements Cloneable{ 
    protected DataStorage Y = new DataStorage(); 

    public A(DataStorage X, about 20 other inputs of different Object types){ 
    this.Y=X; 
    } 

    public static DataStorage getData(){ 
    return this.Y; 
    } 
} 

我在哪裏我要檢索的對象Y或X.通過這樣做,從A.java類的靜態調用另一個文件ServletA.java目標...它工作還是有更好的方法?

public class ServletA{ 
    DataStorage Z = A.getData(); 
} 

注:是的,這不能編譯,但是有解決方案嗎?

我約束我有解決方案:

  • 做出最小的變化A.java因爲它是傳統的代碼庫
  • 有很多20+的輸入爲A()構造函數是一個噩夢
  • 和我的建築師不想要或者通過改變成一個抽象類
  • 不能ServletA.java
創建一個實例去觸摸它

編輯1:我的問題是,如果有一個解決方案從ServletA.java訪問X而不在ServletA.java中創建A的實例。上面的代碼是一個例子,表明我想到了一種方法,但它不起作用。編輯2:如果你想downvote,請問我澄清作爲禮貌。謝謝!

+1

'Y'是特定實例,您需要一個'A'實例來訪問它。 – assylias 2012-07-23 15:41:03

+0

解決方案的約束......不能在ServletA.java中創建A的離子... – bouncingHippo 2012-07-23 15:42:05

+0

Lukas,我的問題是如果有解決方案從ServletA.java訪問X而不在ServletA.java中創建A的實例 – bouncingHippo 2012-07-23 15:42:49

回答

1

如果您只有一個A實例,則應使用singleton模式。 你ServletA代碼應該是這樣的

public class ServletA { 
    DataStorage Z = A.getInstance().getData(); 
} 
+0

這完全是我尋找的,輝煌!謝謝!! – bouncingHippo 2012-07-23 15:52:26

+0

public DataStorage getData(){ \t \t return this.Y; \t} \t \t private static final選項AClone = new A(); \t \t \t 公共靜態甲的getInstance(){\t \t 返回optionClone; \t} – bouncingHippo 2012-07-23 17:37:31

0

我很確定這段代碼不會編譯。您無法從靜態函數中引用this

您可以將A的實例傳遞給ServletA的構造函數,並從A.getData中刪除static

+1

OP已在提示中提到它。 – Sid 2012-07-23 15:45:22

-1

靜態方法沒有this指針可用,所以給出的代碼將不會編譯。是否有一個原因,你需要getData()是靜態的?

1

您可以訪問任何私人(或保護)類字段和方法與反思。其思想是切換安全性,獲取字段或方法,獲取引用/調用方法,然後打開安全性。看起來像一個黑客,但它的作品。

前一段時間,我寫了一個類「ClassRipper」(顯然是重新創建了一個weel)。谷歌搜索與「ClassRipper」給出了一個參考吧:

http://www.koders.com/java/fid7E7F02066CC24469AC29D8A3EB9F74D655E53588.aspx

您的任務一個方便的工具。隨意使用或擴展它。

有StackOverflow上2個類似的主題這一點:根據「EDIT1

Is it possible in Java to access private fields via reflection

How do I read a private field in Java?

UPDATE:我的問題是,如果有從ServletA.java訪問X沒辦法解決在ServletA.java中創建A的一個實例,上面的代碼是一個例子,表明我想到了一個方法,但它不起作用。「

如果不創建A實例,則無法訪問X.X不存在(因爲它不是靜態的)。但是,如果您的ServletA擴展了A - 那麼您可以使用「this」作爲實例。 ClassRipper處理繼承。在這種情況下,您間接擁有A的實例;)

+0

很酷的方法。也會研究他們..謝謝。如果您發現我的問題有用,請注意,因爲其他人可能會因此而失望,因爲他們如此不耐煩:\ – bouncingHippo 2012-07-23 15:58:37

+1

不要認真對待。有些人只是不知道這是典型的問題,因爲他們經常與第三方庫存工作,而且沒有能力改變設計。 – andrey 2012-07-23 16:09:41