2014-03-28 44 views
0

我一直在這個問題上抨擊我的頭一陣子。在java運行時將DBus Variant的值強制轉換爲正確的類型

我正在處理使用DBus的DBus-java綁定的屬性設置。當調用Set時,要設置的值被封裝在一個org.freedesktop.types.Variant對象中,我必須從該對象中提取它。通常,如果數據是基元,我可以在Set參數中使用泛型,綁定在調用Set方法之前進行類型轉換。

但是我試圖設置使用org.freedesktop.types.DBusStructType這是一個複雜的類型,需要手動解壓縮。到目前爲止,我已經到了可以從變體中提取類型的點,但是我不能將包含在變體中的值轉換爲DBusStructType,即使它明確標識爲DBusStructType

下面的代碼會拋出從python dbus測試中用DBus.Struct調用時調用ClassCastException: Cannot cast [Ljava.lang.Object; to org.freedesktop.dbus.types.DBusStructType。我已經檢查過變體簽名是否包裝正確,但我無法找到將Variant.getValue()返回的對象轉換爲Variant.getType()指定的類型並訪問結構字段的方法。

public void Set(String interface_name, String property_name, Variant new_value) throws Exception { 
    Type t = new_value.getType(); 
    Object s = new_value.getValue(); 
    t.getClass().cast(s); 
    System.out.println("Object cast to "+s.getClass().getName()); 
} 

任何指針將非常感激,我已經開始挖掘到更多的反思,我還是新的,但有可能是我丟失的東西。

回答

0

我還沒有使用類型接口,但它看起來像唯一已知的實現類是類。我會建議將它作爲一個類來施放,然後調用Cast。

public void Set(String interface_name, String property_name, Variant new_value) throws Exception { 
    Type t = new_value.getType(); 
    Object s = new_value.getValue(); 
    ((Class)t).cast(s); 
    System.out.println("Object cast to "+s.getClass().getName()); 
} 

希望這有助於。

+0

謝謝,它不會悲傷地工作,但更仔細地看我的類型我終於明白了:我必須將getValue()結果轉換爲正確的類型,對於DBusStructType,它對應於Object [ ]。 – darkhelmet

0

getValue()返回的對象需要轉換爲與Dbus類型對應的正確類型。通過深入挖掘DBusStructType和DBusStruct,Variant.getValue()返回的Object在DBusStruct中是Object []。這裏是工作代碼:

public void Set(String interface_name, String property_name, Variant new_value) throws Exception { 
    Object[] s = (Object[])new_value.getValue();     
    System.out.println("client ID: " + (Long)s[0] + ", string: " + (String) s[1]); 
} 

輸出:

client ID: 0, string: Hello, this is data. 

注意,我鑄造對象[]或將失敗,其他的DBus類型之前做的變體,最終實施的簽名支票。

相關問題