【发布时间】:2015-01-04 01:27:56
【问题描述】:
我正在尝试在程序中加载一个 jar 文件来调用不同的方法。我有一个可以完成工作的类,但是该类使用URLClassLoader 加载jar 文件,这取决于系统类加载器,因此,例如,如果加载的jar 执行System.exit(),它会完成执行整个应用程序,终止当前运行的 Java 虚拟机。我的意图是,如果加载的 jar 最后执行此操作,它只会完成 jar,而不是整个应用程序。另外,我希望能够关闭 jar,以便稍后在需要时重新启动它。我正在使用以下代码从 jar 中实例化所需的类并从我的应用程序中调用方法:
// Load a class with classloader = new URLClassLoader(libs);
if(loadclass == null)
loadclass = Class.forName(classname, true, classloader);
// Execute method
if(met == null)
{
Constructor constructor;
if(params != null && params.length > 0)
{
constructor = loadclass.getConstructor(new Class[]{Object[].class});
classinstance = constructor.newInstance(new Object[]{params});
}
else
{
constructor = loadclass.getConstructor(null);
classinstance = constructor.newInstance(null);
}
return (Object)Boolean.TRUE;
}
// Generic instance
if(classinstance == null)
classinstance = loadclass.newInstance();
// Method invocation
Method method;
if(params != null)
{
if(params.length > 1)
method = loadclass.getMethod(met, new Class[]{Object[].class});
else
method = loadclass.getMethod(met, new Class[]{Object.class});
}
else
method = loadclass.getMethod(met);
method.setAccessible(true);
Object ret;
if(params != null)
{
if(params.length > 1)
ret = (Object)method.invoke(classinstance, new Object[]{params});
else
ret = (Object)method.invoke(classinstance, params[0]);
}
else
ret = (Object)method.invoke(classinstance, null);
return ret;
我不知道如何将我的URLClassLoader 与系统类加载器分离。对此的任何帮助表示赞赏!
【问题讨论】:
-
System.exit不是与类加载器相关的东西。你可能对这种方法不走运。也许看看 SecurityManager 这样你就可以阻止退出尝试? -
是的。正确的方法是使用SecurityManager。谢谢!
标签: java jar jvm classloader urlclassloader