2013-04-03 6 views
0

Я использую SmartGWT, и я хочу получить доступ к com.smartgwt.client.Version из JavaScript. В веб-консоли Firefox, я попробовал:Вызов Java из Javascript JSNI

frames[0].$entry(Lcom_smartgwt_client_Version::getVersion()));

и

frames[0].$entry(@com.smartgwt.client.Version.getVersion());

и

frames[0].$entry(@com.smartgwt.client.Version::getVersion());

и

frames[0].$entry(@com.smartgwt.client.Version::getVersion()());

Но все они возвращают синтаксическую ошибку.

SmartGWT развернут с моей ВОЙНОЙ, и я вижу другие классы SmartGWT, перечисленные, когда я всего лишь frames[0].

Каков правильный синтаксис для вызова этого статического метода Java?

ответ

6

Эти ссылки JSNI не работают, за исключением кода JSNI в ваших java-файлах. Ссылки на методы и поля Java в JSNI на самом деле не являются действительными JavaScript, а являются частью языка JSNI, чтобы эти собственные методы могли использовать как Java, так и JavaScript. Строка JSNI @com.smartgwt.client.Version::getVersion()() будет переписана как что-то вроде $getVersion1() в PRETTY, или что-то еще один или два символа в режиме OBF, поэтому вы не можете полагаться на то, что это имя метода одинаково.

Вместо этого вам нужно экспортировать функцию JavaScript из вашего приложения, чтобы этот внешний JavaScript мог его вызывать. Обратитесь к https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#calling за конкретную информацию по этому вопросу.

Вот пример того, как это может выглядеть в вашем приложении:

public native void exportGetVersion() /*-{ 
    $wnd.getSmartGwtVersion = $entry(function() { 
    return @com.smartgwt.client.Version::getVersion()(); 
    }); 
}-*/; 

Убедитесь, что вы вызываете эту функцию в приложении где-то экспортировать функцию - в любое время после этого вызывается, вы можете вызвать getSmartGwtVersion() от вашего обычного JavaScript - не нужно использовать frames или $entry.

Смежные вопросы