GWT Динамическая загрузка с помощью GWT.create () со Строковыми литералами вместо литералов Класса

Если вы недавно установили или обновили пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform, дважды проверьте, что версии этого пакета, на которые ссылается ваш проект, указывают на правильную и ту же версию этого пакета:

  • В ProjectName.csproj убедитесь, что присутствует тэг <Import> для Microsoft.CodeDom.Providers.DotNetCompilerPlatform и указывает на правильную версию.
  • В ProjectName.csproj убедитесь, что тег <Reference> для Microsoft.CodeDom.Providers.DotNetCompilerPlatform присутствует и указывает на правильную версию, как в атрибуте Include, так и на потомке <HintPath>.
  • В этом web.config проекта убедитесь, что присутствует тэг <system.codedom>, и что его дочерние <compiler> теги имеют одну и ту же версию в свой атрибут type.

По какой-то причине в моем случае обновление этого пакета с 1.0.5 до 1.0.8 вызвало <Reference> в .csproj, чтобы его Include указывал на старую версию 1.0.5.0 (которую я удалил после обновления пакета), но все остальное указывало на новую и правильную версию 1.0.8.0.

15
задан Sathish 16 January 2009 в 19:36
поделиться

6 ответов

Не просматривавший код rocket/gwittir (который необходимо сделать, если Вы хотите узнать, как они сделали это, это - открытый исходный код, в конце концов), я могу только предположить, что они используют задержанную привязку таким способом, которым в течение времени компиляции, они разрабатывают все вызовы к отражению и статически генерируют весь код, требуемый реализовать, они звонят. Таким образом во время времени выполнения, Вы наклоняетесь, делают различные.

1
ответ дан 1 December 2019 в 01:39
поделиться

Что точно является вопросом - я предполагаю, что Вы хотите передать параметры в дополнение к литералу класса к генератору.

, Поскольку Вы, вероятно, уже знаете, что литерал класса передал GWT.create (), главным образом селектор так, чтобы GWT мог выбрать и выполнить генератор, который в конце выкладывает класс. easist способ передать параметр генератору состоит в том, чтобы использовать аннотации в интерфейсе и передать interface.class GWT.create (). Обратите внимание, конечно, что интерфейс/класс должен расшириться, литерал класса передал в GWT.create ().

class Selector{
}

@Annotation("string parameter...")
class WithParameter extends Selector{}

Selector instance = GWT.create( WithParameter.class )
4
ответ дан 1 December 2019 в 01:39
поделиться

То, что вы пытаетесь сделать, невозможно в GWT.

Хотя GWT хорошо эмулирует Java во время компиляции, среда выполнения, конечно, совершенно другая. Большинство отражений не поддерживается, и невозможно сгенерировать или динамически загрузить классы во время выполнения.

Я бегло просмотрел код Gwittir, и я думаю, что они делают свои «рефлексии» во время компиляции. Здесь: http://code.google.com/p/gwittir/source/browse/trunk/gwittir-core/src/main/java/com/totsp/gwittir/rebind/beans/IntrospectorGenerator.java

1
ответ дан 1 December 2019 в 01:39
поделиться

Все возможно .. хотя может быть сложно или даже бесполезно. Как упоминал Ян, для этого вам следует использовать генератор. По сути, вы можете создать свой интерфейс с помощью кода генератора, который берет этот интерфейс и компилирует во время создания и возвращает вам экземпляр. Примером может быть:

//A marker interface
public interface Instantiable {
}
//What you will put in GWT.create
public interface ReflectionService {
 public Instantiable newInstance(String className);
}
//gwt.xml, basically when GWT.create finds reflectionservice, use reflection generator
<generate-with class="...ReflectionGenerator" >
<when-type-assignable class="...ReflectionService" />
</generate-with>  
//In not a client package
public class ReflectionGenerator extends Generator{
...
}
//A class you may instantiate
public class foo implements Instantiable{
}
//And in this way
ReflectionService service = GWT.create(ReflectionService.class);
service.newInstance("foo");

Все, что вам нужно знать, это как сделать генератор. Я могу сказать вам, что в конце вы делаете в генераторе код Java следующим образом:

if ("clase1".equals(className)) return new clase1();
else if ("clase2".equals(className)) return new clase2();
...

В конце я подумал, что обычно я могу сделать это вручную в своего рода InstanceFactory ... С уважением

2
ответ дан 1 December 2019 в 01:39
поделиться

Это возможно, хотя и сложно. Вот кровавые подробности:

Если вы думаете, что GWT только как прямая Java для JS, это не сработает. Однако, если вы рассматриваете генераторы - специальные классы с вашим компилятором GWT, компилирует и выполняет во время компиляции, это возможно. Таким образом, вы можете генерировать исходный код java даже при компиляции.

У меня была такая потребность сегодня - наша система имеет дело с динамическими ресурсами вне службы, заканчивающимися строкой и потребностью в классе. Вот решение, которое я придумал - кстати, оно работает под хостингом, IE и Firefox.

  • Создайте модуль GWT, объявляя:
    • Исходный путь
    • Генератор (который должен храниться ВНЕШНИЙ пакет исходного пути модуля GWT )
    • Замена интерфейса (вместо интерфейса будет внедрен класс Generated)
  • Внутри этого пакета создайте интерфейс Marker (я называю его Constructable).Генератор будет искать этот маркер
  • . Создайте базовый абстрактный класс для хранения этой фабрики. Я делаю это, чтобы упростить сгенерированный исходный код
  • Объявить этот модуль, наследующий от вашего Application.gwt.xml

Некоторые примечания:

  • Ключ к пониманию связан с концепцией генераторов;
  • По порядку для облегчения пригодился базовый класс Abstract.
  • Также имейте в виду, что в сгенерированный исходный код .js и даже в сгенерированный исходный код Java существует указание имени.
  • Помните, что генератор выводит файлы java.
  • GWT.create требует ссылки на файл .class. Выходные данные вашего генератора могут делать это, если на них каким-то образом ссылается ваше приложение (проверьте, что Application.gwt.xml наследует ваш модуль, который также заменяет интерфейс на генератор, объявленный вашим Application.gwt.xml)
  • Оберните GWT .create внутри фабричного метода / синглтона, а также в GWT.isClient ()
  • . Очень хорошая идея также обернуть ваши вызовы загрузки классов кода вокруг GWT.runAsync, так как это может потребоваться для запуска модуль нагрузки. Это ОЧЕНЬ важно.

Я надеюсь опубликовать исходный код в ближайшее время. Скрестите пальцы. :)

13
ответ дан 1 December 2019 в 01:39
поделиться

Я смог сделать то, что, как я думаю, вы пытаетесь сделать, а именно загрузить класс и привязать его к событию динамически; я использовал Generator для динамической привязки класса к событию. Я не рекомендую это делать, но вот пример, если это поможет:

http://francisshanahan.com/index.php/2010/a-simple-gwt-generator-example/

2
ответ дан 1 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: