[Jython]Javaで定義されたフィールドを名前の文字列で取得する方法
SWTでは、たとえばSHIFT+CTRL+F5をメニューのアクセラレータに指定するには
from org.eclipse.swt import SWT menu.setAccelerator(SWT.SHIFT + SWT.CTRL + SWT.F5)
というようにおのおのの値を足しあわせてやる必要があります。しかしいちいちSWTと書くのは面倒ですし、 from org.eclipse.swt.SWT import * とやってSWTパッケージの中身を全部取得してしまうのはスマートではありません。そこで "SHIFT+CTRL+F5" という文字列を"+"でsplitして、"SHIFT"という文字列からSWT.SHIFTの値を取得しようと思いました。
Pythonでは、あるパッケージ X の中にある name という名前のオブジェクトは X.__dict__[name] で取得することができます。しかしJythonでこれをやると、オブジェクトは取得されますが、フィールドが整数であっても取得されたオブジェクトはPyIntegerではなくPyReflectedFieldです。_dogetを呼んでPyIntegerを取得してやる必要があります。
下のコードでは、"CTRL+SHIFT+O"などという文字列がaccelに入っている場合に、 SWT.CTRL + SWT.SHIFT + ord("O") をメニューmenuのアクセラレータに指定し、与えられた文字列自身もメニューに表示します。
if accel != "":
from org.eclipse.swt import SWT
intAccel = 0
for key in accel.split("+"):
if SWT.__dict__.has_key(key):
v = SWT.__dict__[key]._doget(SWT)
intAccel += v
else:
intAccel += ord(key)
menu.setAccelerator(intAccel)
menu.setText(text + " " + accel)