在Java中修改运行时的内联常量

时间:2014-04-23 09:01:02

标签: java windows reflection runtime swt

我正在尝试打开SWT的DirectoryDialog而不在Windows上显示“Make new folder”按钮。 Windows的API支持这一点,但不幸的是SWT没有。

您可以在此处查看SWT的Windows实施:http://kickjava.com/src/org/eclipse/swt/widgets/DirectoryDialog.java.htm

第193行是神奇发生的地方。

 lpbi.ulFlags = OS.BIF_NEWDIALOGSTYLE | OS.BIF_RETURNONLYFSDIRS | OS.BIF_EDITBOX | OS.BIF_VALIDATE;

我想将BIF_NONEWFOLDERBUTTON添加到标志中(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx)。

我尝试通过丑陋的反射黑客来实现这一点,我通过对静态字段执行按位OR将BIF_NONEWFOLDERBUTTON添加到OS.BIF_NEWDIALOGSTYLE。

不幸的是没有效果。我假设它是因为Java内联它(因为它是编译时常量)。

因此,我的问题是:如何在运行时修改第193行以使其包含此常量?

2 个答案:

答案 0 :(得分:3)

我认为不可能。如果你能以某种方式访问​​lpbi(例如,如果它是一个字段而不是局部变量),你可以这样做。如果你有一个单独的应用程序而不是Eclipse插件,你可以"只是"修补SWT并在应用程序中包含修补版本。

答案 1 :(得分:2)

我认为你能做到这一点的唯一方法是制作你自己的DirectoryDialog副本并修改它。我没有在Windows上试过这个,但类似的代码适用于Mac OS X.

由于此类使用内部类(尤其是OS类),因此会破坏Eclipse API Rules of Engagement。您可以通过更新新版本中的内部类来破坏您的代码。

该类还特定于特定的操作系统和体系结构(Windows 32位或Windows 64位)。这可以通过使用特定于操作系统和体系结构的插件或片段来管理。