Вот очень простой пример того, что я вижу:
jrunscript -f -
js> var d = new java.util.Date();
js> var m = d.getClass().getMethods();
js> println(m[0].getClass().getName());
java.lang.reflect.Method
js> var name = m[0].getName();
script error: sun.org.mozilla.javascript.internal.WrappedException: Wrapped java.lang.UnsupportedOperationException: invocation not supported (<STDIN>#1) in <STDIN> at line number 1
js> var time = d.getTime();
js> println(time);
1278421741768
js>
Переменная «d» - это экземпляр Java «Date», а «m» - массив объектов Java «Method» для класса «Date». Однако когда я пытаюсь вызвать getName()
на одном из экземпляров «Method», это не работает. Обратите внимание, что вызов getTime()
в экземпляре «Date» работает нормально, как и почти все другие вызовы объектов Java. (Ну, конечно, я не проводил исчерпывающее исследование, но в целом это работает, и поэтому «Метод» кажется странным.)
Если я напишу (на стороне Java) класс, который в основном обёртывает «Метод» и делегирует, это прекрасно работает. Так что не существует какого-то внутреннего барьера между доменом Javascript и тем, что предоставляет «Метод». (Действительно, я полагаю, что сам уровень сценария должен отражать, чтобы в первую очередь обеспечить базовые возможности.)
Я помню, что столкнулся с этой проблемой и взломал ее в прошлый раз, когда я дурачился с Rhino через среду сценариев JDK 6. Я не помню, понял ли я, почему это происходит или нет. Кто-нибудь знает?