gpt4 book ai didi

java - GWT 服务器端反射

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:40:53 24 4
gpt4 key购买 nike

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

如果我将参数更改为字符串(而不是“PassMe”类),它可以正常工作。为什么它不喜欢通过我的“PassMe”类(class)?我认为这可能是序列化的问题,尽管它是 100% 服务器代码,但我也没有运气。

提前感谢任何人可以给我的任何帮助。

最佳答案

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

ClassLoader dynClassLoader = PassMe.class.getClassLoader();

并且您可以再次使用 PassMe.class 样式查找。用于查找加载程序的类似乎并不重要。只是不是系统加载程序。

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

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

关于java - GWT 服务器端反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com