如何知道 OpenOffice Calc UNO 对象支持的 Java 接口(通过 queryInterface)

How to know the Java interfaces an OpenOffice Calc UNO object supports (through queryInterface)

我正在为 OpenOffice Calc 开发 "macro"。作为语言,我选择了 Java,以便在 Eclipse 中获得代码帮助。我什至写了一个小的 ant 构建脚本来编译 "macro" 并将其嵌入到 *.ods 文件中。总的来说,这工作得很好,而且速度出奇地快;我已经非常成功地使用了一些简单的东西。

但是

我经常被卡住,因为使用 UNO,我需要 "query" 任何给定的非平凡对象的接口,以便能够访问该对象的数据/调用方法。也就是说,我确实需要猜测给定对象可能提供哪些接口。这 一点也不 明显,甚至在 Java 开发过程中(通过某种元信息、反射等)也不可见,而且文档也很少(我下载了很多的东西,但我没有找到我正在使用的接口的来源或 JavaDoc,例如 XButtonXPropertySet 等。- XButtonsetLabel,但 不是 getLabel - 什么??)。

有在线文档(对于最基本的概念,一点也不差!),但是它缺少我所面对的许多细节。它总是神奇地停在我需要解决的地方。

我愿意查看 C++ 代码以了解对象(例如,我目前遇到的按钮/事件)可能提供的接口。令人困惑的是,C++ class 和文件名与 Java 接口并不完全匹配。 几乎是我要找的东西,但是在Java中我并没有真正找到等价物,调用queryInterface 在给定对象上 returns null.. 变得有点令人沮丧。

UNO Java 接口是如何生成的?代码中是否有某种文档作为生成的 (Java) 代码的来源?

我想我真的需要知道什么时候可用的接口,以便在Java- UNO-宏 开发.

对于任何严肃的 UNO 项目,请使用内省工具。

例如,我在 Calc 中创建了一个按钮,然后使用 Java Object Inspector 浏览到该按钮。 右键单击并选择 "Add to Source Code" 生成以下内容。

import com.sun.star.awt.XControlModel;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.drawing.XControlShape;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;

//...
public void codesnippet(XInterface _oUnoEntryObject){
try{
    XSpreadsheetDocument xSpreadsheetDocument =  (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject);
    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
    XNameAccess xNameAccess =  (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets);
    Object oName = xNameAccess.getByName("Sheet1");
    XDrawPageSupplier xDrawPageSupplier =  (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName);
    XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
    XIndexAccess xIndexAccess =  (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage);
    Object oIndex = xIndexAccess.getByIndex(0);
    XControlShape xControlShape =  (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex);
    XControlModel xControlModel = xControlShape.getControl();
    XPropertySet xPropertySet =  (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel);
    String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label"));
}catch (com.sun.star.beans.UnknownPropertyException e){
    e.printStackTrace(System.out);
    //Enter your Code here...
}catch (com.sun.star.lang.WrappedTargetException e2){
    e2.printStackTrace(System.out);
    //Enter your Code here...
}catch (com.sun.star.lang.IllegalArgumentException e3){
    e3.printStackTrace(System.out);
    //Enter your Code here...
}
}
//...

Python-UNO可能比Java好,因为它不需要查询具体接口。 XrayTool 和 MRI 也比 Java Object Inspector 更易于使用。