Java GWT服务器端反射

Java GWT服务器端反射,java,reflection,gwt,Java,Reflection,Gwt,我正在尝试仅在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[] arg

我正在尝试仅在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();
    }
}
}

以及:

这个很好。当我尝试从GWT服务器端类运行它时,它不起作用,而是返回

 java.lang.NoSuchMethodException: com.xyz.reflection.RunMe.returnSid(com.xyz.reflection.PassMe)
如果我将参数更改为字符串(而不是“PassMe”类),它可以正常工作。为什么不喜欢通过我的“PassMe”课程?尽管是100%的服务器代码,但我认为这可能是序列化的一个问题,但我在这方面也没有任何运气


提前感谢任何人在这方面给我的帮助。

这几乎是瞎猜,但是如果你换了新的,会有帮助吗
dynMethod=dynInstance.getClass().getMethod(“returnSid”,
新类[]{PassMe.Class});


dynMethod=dynInstance.getClass().getMethod(“returnSid”,PassMe.class);
?


它在GWT服务器之外没有什么区别,但它可能以不同的方式运行容器的VM。

您是否将反射文件放在服务器端包中? 例如:
org.myproject.client-您的gwt客户机包(将您的java文件放在这里,这些文件可以编译为java脚本而无需反射)
org.myproject.server-在此处放置任何java文件,包括反射

org.myproject.shared-将能够编译成java脚本的java类放在这里

我认为这可能与类加载有关-但这只是一种预感,因为我无法在类似于您的上下文中使用它

以下是一些可以尝试的建议:

您使用:

ClassLoader dynClassLoader = ClassLoader.getSystemClassLoader();

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

但是,要加载您使用的PassMe类,请执行以下操作:

PassMe.class
尝试通过dynClassLoader加载PassMe类,并在getMethod()中使用该实例,而不是PassMe.Class


我想知道,您是否需要使用dynClassLoader?

除了finrod的解决方案外,您还可以将类加载器更改为如下内容:

ClassLoader dynClassLoader = PassMe.class.getClassLoader();
您可以再次使用PassMe.class样式的查找。不过,用于查找加载程序的类似乎并不重要。只是不是系统加载器

奇怪的东西。不过,我不会怀疑GWT是否在类加载器上做了一些奇怪的事情


编辑:是的。GWT在开发模式下将系统类加载器设置为
com.google.appengine.tools.development.IsolatedAppClassLoader

很好的尝试,但没有雪茄。不幸的是,这似乎没有什么区别;但是非常感谢您抽出时间来帮助我。我已经尝试过在“org.myproject.server”和“org.external.reflection”中使用反射代码(包括构建路径中的外部项目/包),这两种代码都没有什么区别。要确认,它们都不在客户机源路径的*.gwt.xml文件中。这仍然是:谢谢你的时间。这一个让我好奇,所以我尝试了一下。如果您使用相同的加载程序来实例化PassMe,那么它可以正常工作。可能与GWT的秘密RPC酱有很大关系。您使用什么来运行GWT服务器(GWT托管模式?单机或嵌入式战争容器(如Jetty)?太好了!我所要做的就是更改您突出显示的行,它就像一个梦一样工作。感谢您和finrod,他们成功了。+1对你们两个来说:o)很抱歉延迟回复,我一直在度假。为了进一步阅读类路径,我发现了这篇古老但信息丰富的文章:
PassMe.class
ClassLoader dynClassLoader = PassMe.class.getClassLoader();