我一直在這個問題上抨擊我的頭一陣子。在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());
}
任何指針將非常感激,我已經開始挖掘到更多的反思,我還是新的,但有可能是我丟失的東西。
謝謝,它不會悲傷地工作,但更仔細地看我的類型我終於明白了:我必須將getValue()結果轉換爲正確的類型,對於DBusStructType,它對應於Object [ ]。 – darkhelmet