Почему Javascript (работающий в Rhino) не может получить доступ к методам экземпляра java.lang.reflect.Method? - PullRequest
1 голос
/ 06 июля 2010

Вот очень простой пример того, что я вижу:

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. Я не помню, понял ли я, почему это происходит или нет. Кто-нибудь знает?

1 Ответ

1 голос
/ 06 июля 2010

IIRC, это потому, что ряд методов используют непосредственный вызов для определенных проверок безопасности. Если вы используете Method.invoke для вызова этих методов, то вызывающий invoke принимается за непосредственный вызывающий. Эти методы перечислены в разделе 6 действующего Руководства по безопасному кодированию Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...