Защо Javascript (работещ в Rhino) не може да има достъп до методи на екземпляр на java.lang.reflect.Method?

Ето един много прост пример за това, което виждам:

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() на един от екземплярите на „Метод“ обаче, това не работи. Обърнете внимание, че извикването на getTime() на екземпляра "Дата" работи добре, както и почти всички други извиквания към Java обекти. (Е, разбира се, не съм провеждал изчерпателно проучване, но като цяло работи и затова „Методът“ изглежда странен.)

Ако напиша (от страна на Java) клас, който основно обвива "Метод" и делегати, това работи добре. Така че не е като да има някаква присъща бариера между домейна на Javascript и нещата, които "Method" доставя. (Наистина, предполагам, че самият слой на скрипта трябва да извърши отражение, за да осигури основното съоръжение на първо място.)

Спомням си, че се сблъсках с този проблем и го хакнах последния път, когато се забавлявах с Rhino чрез рамката на скрипта JDK 6. Не помня дали разбрах защо се случва или не. някой знае ли


person Pointy    schedule 06.07.2010    source източник


Отговори (1)


IIRC, това е така, защото редица методи използват непосредствения повикващ за определени проверки за сигурност. Ако използвате Method.invoke за извикване на тези методи, тогава извикващият invoke се приема за непосредствен извикващ. Тези методи са изброени в раздел 6 от текущите Указания за защитено кодиране на Java.

person Tom Hawtin - tackline    schedule 06.07.2010
comment
Е, това е много интересна препратка, но не е ясно (поне за мен) дали това има пряко отношение към това, което виждам. В момента не използвам никакъв мениджър за сигурност и изключението, което получавам, не показва проблем със сигурността - това е просто неподдържана операция. - person Pointy; 06.07.2010
comment
Прави се от съображения за сигурност. Няма причина да намесвате мениджъра по сигурността. Наистина е много добра идея един и същ код да се държи по същия начин, независимо дали има наличен мениджър по сигурността или не. - person Tom Hawtin - tackline; 06.07.2010