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

我试图让SWT的DirectoryDialog打开,而没有在Windows上显示“Make new folder”button。 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 )。

我已经尝试了通过一个丑陋的reflection黑客,我添加BIF_NONEWFOLDERBUTTON到OS.BIF_NEWDIALOGSTYLE通过做一个按位或或静态字段。

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

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

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

由于这个类使用内部类(特别是OS类),所以这将违反Eclipse API接合规则 。 您的代码可能会因新版本中内部类的更改而中断。

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

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