在java运行时将DBus Variant的值强制转换为正确的类型



我已经为这个问题绞尽脑汁有一段时间了

我正在处理使用DBus-java绑定的属性设置。当调用Set时,要设置的值被包装在org.freedesktop.types.Variant对象中,我必须从中提取它。通常,如果数据是原语,我可以在Set参数中使用泛型,绑定在调用Set方法之前进行类型转换。

然而,我试图使用org.freedesktop.types.DBusStructType设置,这是一个复杂的类型,需要手动解包。到目前为止,我已经到了可以从变体中提取类型的地步,但我不能将变量中包装的值转换为DBusStructType,即使它被清楚地标识为DBusStructType

下面的代码在使用DBus调用时抛出一个ClassCastException: Cannot cast [Ljava.lang.Object; to org.freedesktop.dbus.types.DBusStructType。结构从python dbus测试。我已经检查了变体签名包装正确,但我找不到一种方法来将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());
}

任何指示将是非常感激的,我已经开始挖掘更多的反思,因为我仍然是新的,但有可能是我错过的东西。

我根本没有使用类型接口,但看起来唯一已知的实现类是class。我建议将其转换为Class,然后调用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());
}

getValue()返回的Object需要转换为与Dbus类型对应的正确类型。通过深入挖掘DBusStructType和DBusStruct, variable . 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.

请注意,在强制转换Object[]之前,我在最终实现中对变体进行了签名检查,否则它将与其他DBus类型一起失败。

相关内容

  • 没有找到相关文章

最新更新