2014-12-05 56 views
0

我正在通過一個Maven依賴項來實現一個服務,該服務在另一個虛擬位置提取數據並將其吐出,前提是它符合嚴格的類型要求。但是,我已經換出了其中一個字段(我們將其稱爲字段Buzz以及我的實施Buzzer),並且想知道是否可以使用該服務的其餘部分進行此項工作。在實現的方法上破解返回類型的最佳方法?

的服務是一個工廠需要的類型BuzzBuzzBuzzer之間的差異是一些額外添加成員字段的電話。有什麼黑客我可以做,使工廠接受Buzzer?仔細查看代碼,該服務似乎沒有做任何依賴於Buzz的哈希碼是正確的。

編輯:實例

class Buzz 
{ 
    public String ID 
    public String name 
    public String title 
    public Iterable<profile> profiles 


    public myConstructor(String ID, String name, String title, Iterable profile) 
    { 
    this.var = var; 
    } 
} 

class Buzzer 
{ 
    public String ID 
    public String name 
    public String title 
    public profile profiles 

    public myConstructor(String ID, String name, String title, profile profiles) 
    { 
    this.var = var; 
    } 
} 

其中profile是一個定義的對象

+1

如果你肯定的是,框架不關心的'Buzzer',我在想,你可以有'Buzzer'延長'Buzz'這些額外領域。 – Makoto 2014-12-05 18:21:54

+0

你不能'Buzzer'擴展'Buzz'嗎? – Mureinik 2014-12-05 18:22:01

+0

我試過了,但我得到了「Buzz」中沒有默認的構造函數「 – 2014-12-05 18:30:28

回答

1

如果能有蜂鳴器延伸巴茲,那將是理想的。如果你不能(例如,如果它來自第三方庫並聲明爲最終類),那麼hack解決方案將是「獲取」一個Buzz實例(這將取決於特定的場景)。如果你不能, ..需要更多的信息更具體)。然後通過反射修改其buzz屬性。

事情是這樣的:

String buzz = null; // Assuming Buzz field is a string in this example 
Field fBuzz = null; 
try 
{ 
    Class<?> cBuzz = theBuzzInstance.getClass(); 
    fBuzz = cBuzz.getDeclaredField("buzz"); 
    fBuzz.setAccessible(true); 
    buzz = (String) fBuzz.get(theBuzzInstance); 

    String newBuzz = "Hacked!"; 
    fBuzz.set(theBuzzInstance, newBuzz); 
} 
catch(Exception e) 
{ 
    // TODO: Error handling 
}