将Groovy RootLoader与Java 8 SystemClassLoader集成
下面是我使用的一个库的深层信息。2015年,Groovy 2.3和2.4的早期版本(可能是Java 6或Java 7)实现了这一点!在尝试修改Java9+之前,我想更新到Java8将Groovy RootLoader与Java 8 SystemClassLoader集成,java,groovy,classloader,Java,Groovy,Classloader,下面是我使用的一个库的深层信息。2015年,Groovy 2.3和2.4的早期版本(可能是Java 6或Java 7)实现了这一点!在尝试修改Java9+之前,我想更新到Java8 final class DynamicClassLoader extends ClassLoader { final NodeID originatingNode; NetChannelOutput requestClassData; NetChannelInput classDataRes
final class DynamicClassLoader extends ClassLoader {
final NodeID originatingNode;
NetChannelOutput requestClassData;
NetChannelInput classDataResponse = NetChannel.net2one();
final Hashtable classes = new Hashtable();
DynamicClassLoader(NodeID originator, NetChannelLocation requestLocation) {
super(ClassLoader.getSystemClassLoader());
this.originatingNode = originator;
this.requestClassData = NetChannel.one2net(requestLocation);
}
...
}
当我尝试从Groovy调用代码时,出现以下错误:
org.codehaus.groovy.tools.RootLoader无法强制转换为jcsp.net2.mobile.DynamicClassLoader
以下代码中的行中给出了从中调用的点**
public byte[] filterTX(Object obj)
throws IOException
{
ClassLoader loader = obj.getClass().getClassLoader();
byte[] bytes = this.internalFilter.filterTX(obj);
if (loader == ClassLoader.getSystemClassLoader() || loader == null)
{
DynamicClassLoaderMessage message = new DynamicClassLoaderMessage(Node.getInstance().getNodeID(),
(NetChannelLocation) ClassManager.in.getLocation(), bytes);
byte[] wrappedData = this.internalFilter.filterTX(message);
return wrappedData;
}
**DynamicClassLoader dcl = (DynamicClassLoader)loader;**
DynamicClassLoaderMessage message = new DynamicClassLoaderMessage(dcl.originatingNode,
(NetChannelLocation) ClassManager.in.getLocation(), bytes);
byte[] wrappedData = this.internalFilter.filterTX(message);
return wrappedData;
}
在与Groovy社区讨论之后,我发现问题在于Intellij调用Groovy脚本的方式。代码在Eclipse中工作没有任何问题。在Intellij中,有必要为我想要并行运行的每个脚本创建一个jar工件,然后可以从命令行界面运行。我用Java8重新编码了这个应用程序,它工作起来没有问题。希望有帮助。问题是什么?我们应该猜出错误发生的那一行吗?我已经添加了错误发生的那一行的方法,很抱歉在第一个实例中省略了它OK,但答案是显而易见的-变量
loader
包含RootLoader
,无法转换为DynamicClassLoader
。你必须调试你的代码。没有足够的信息建议smth