GWT Отражение на стороне сервера - PullRequest
3 голосов
/ 08 июля 2010

Я пытаюсь использовать Reflection на стороне сервера только приложения GWT. У меня есть базовый пример работы в не-GWT примере, который можно увидеть ниже.

package com.xyz.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class EntryPoint {

/**
 * @param args
 */
public static void main(String[] args) {

    ClassLoader dynClassLoader = ClassLoader.getSystemClassLoader();

    Class<?> dynClass = null;
    try {
        dynClass = dynClassLoader.loadClass("com.xyz.reflection.RunMe");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    Object dynInstance = null;
    try {
        dynInstance = dynClass.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    Method dynMethod = null;
    try {
        try {
            dynMethod = dynInstance.getClass().getMethod("returnSid",
                    new Class[] { PassMe.class });

        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        String returnValue = (String) dynMethod.invoke(dynInstance,
                new Object[] { new PassMe() });

        System.out.println("Return Value: " + returnValue.toString());

    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

}

используя точно названное:

    package com.xyz.reflection;

public class PassMe {

private String sid = "DEFAULT_SID";

public PassMe() {
    this.sid = "INITIATED_SID";
}

public String getSid() {
    return sid;
}

public void setSid(String sid) {
    this.sid = sid;
}

}

и

    package com.xyz.reflection;


public class RunMe {

    public String returnSid(PassMe s) {
        return s.getSid();
    }
}

Это работает нормально. Когда я пытаюсь запустить его из класса GWT-сервера, он не работает, а вместо этого возвращает

 java.lang.NoSuchMethodException: com.xyz.reflection.RunMe.returnSid(com.xyz.reflection.PassMe)

Если я изменю параметр на String (вместо класса 'PassMe'), он будет работать нормально. Почему не нравится проходить мой класс PassMe? Я думал, что это может быть проблема с сериализацией, несмотря на то, что он на 100% серверный код, но мне тоже не повезло с этим.

Заранее благодарен за любую помощь, которую кто-нибудь может оказать мне с этим.

Ответы [ 4 ]

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

В дополнение к решению finrod вы также можете изменить свой загрузчик классов на что-то вроде:

ClassLoader dynClassLoader = PassMe.class.getClassLoader();

И вы можете снова использовать поиск стиля PassMe.class.Класс, используемый для поиска загрузчика, похоже, не имеет значения.Только не системный загрузчик.

Странные вещи.Я не сомневаюсь, что GWT делает что-то странное с загрузчиком классов.

Редактировать: Да.GWT устанавливает загрузчик системного класса на com.google.appengine.tools.development.IsolatedAppClassLoader в режиме разработки.

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

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

Вот несколько советов, которые стоит попробовать:

Вы используете:

ClassLoader dynClassLoader = ClassLoader.getSystemClassLoader();

dynClass = dynClassLoader.loadClass("com.xyz.reflection.RunMe");

Чтобы загрузить класс RunMe.

Однако для загрузки класса PassMe вы используете:

PassMe.class

Попробуйте загрузить класс PassMe через dynClassLoader и использовать этот экземпляр в getMethod () вместо PassMe.class.

Интересно, вам нужно использовать dynClassLoader?

0 голосов
/ 09 июля 2010

Вы поместили свой файл отражения в серверный пакет?Например:
org.myproject.client - ваш клиентский пакет gwt (поместите здесь ваши java-файлы, которые можно выполнить в java-скрипт, БЕЗ ОТРАЖЕНИЯ)
org.myproject.сервер - поместите здесь все java-файлы, включая отражение
org.myproject.shared - поместите здесь java-классы, которые можно скомпилировать в java-скрипт

0 голосов
/ 08 июля 2010

Это в значительной степени выстрел в темноте, но поможет ли это, если вы замените dynMethod = dynInstance.getClass().getMethod("returnSid", new Class[] { PassMe.class });

с

dynMethod = dynInstance.getClass().getMethod("returnSid", PassMe.class );

Это не имеет значения вне сервера GWT, но может по-разному использовать виртуальную машину контейнера.

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