【发布时间】:2013-12-18 07:19:47
【问题描述】:
我喜欢调用RMI,但是抛出了异常,这是怎么回事?
线程“主”java.rmi.UnmarshalException 中的异常:错误 解组返回;嵌套异常是: java.lang.ClassNotFoundException: test.Hello (没有安全管理器: RMI 类加载器已禁用)在 sun.rmi.registry.RegistryImpl_Stub.lookup(未知来源)在 java.rmi.Naming.lookup(未知来源)在 com.xx.rmiproxy.RmiProxy.call(RmiProxy.java:39) 在 com.xx.rmiproxy.RmiProxy.main(RmiProxy.java:18) 原因: java.lang.ClassNotFoundException:test.Hello(没有安全管理器:RMI 类加载器禁用)在 sun.rmi.server.LoaderHandler.loadProxyClass(未知来源)在 java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
public String call(String rmiId, String json) throws Exception{
RmiInterfaceDescription desc = dao.getDescriptionById(rmiId);
desc.setJarFile("d:\\test.jar");
RmiClientClassLoader rmiClassLoader = new RmiClientClassLoader(null,desc);
Class interfaceClass = rmiClassLoader.loadClass(desc.getInterfaceName());
List<String> paraClasses = desc.getParaClasses();
Class returnClass = rmiClassLoader.loadClass(desc.getReturnClass());
Object obj = Naming.lookup(desc.getRmiUrl());
Class[] parameterTypes = new Class[paraClasses.size()];
for(int i=0;i<paraClasses.size();i++){
parameterTypes[i]= rmiClassLoader.loadClass(paraClasses.get(i));
}
Method method = interfaceClass.getDeclaredMethod(desc.getMethodName(),
parameterTypes);
Object params[] = parseParamsFromJson();
Object result = method.invoke(obj, "ssd");
return encode(result);
}
.....
public class RmiClientClassLoader extends URLClassLoader {
public static void main(String args[]) throws Exception {
RmiInterfaceDescription description = new RmiInterfaceDescription();
description.setJarFile("d:\\test.jar");
RmiClientClassLoader cl = new RmiClientClassLoader(null, description);
Class clientClass = cl.loadClass("test.client.HelloClient");
}
private String basedir;
private RmiInterfaceDescription description;
@SuppressWarnings("deprecation")
public RmiClientClassLoader(String basedir,
RmiInterfaceDescription description) throws MalformedURLException {
super(new URL[] { new File(description.getJarFile()).toURL() });
this.basedir = basedir;
this.description = description;
}
【问题讨论】:
标签: java classloader rmi