Java GWT服务器端反射
我正在尝试仅在GWT应用程序的服务器端使用反射。我有一个在非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
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();