2011-11-03 39 views
0

我必须用一个数字图书馆,其代码从FORTRAN产生。结果代码非常快,但是它只有static方法。问题是这些方法有副作用(它们会改变静态字段),因此与多线程不兼容。沙箱静态字段

有没有一种方法来沙箱呢? (每个线程看到不同类)

PS:更改库不是一种选择,因为所生成的代码是不是人类友好。 (事实上​​,原始的FORTRAN代码也不是人类友好的)

回答

2

我认为你可以简单地从库方法调用中删除所有static关键字和类名称(如果生成的代码限定了具有类名称的静态方法)。这两个操作都是简单的查找和替换,因此您不需要了解生成的代码。

然后,每个线程可以有自己的库类的实例。

如果这不是一个选择,也许你可以提供它自己的定制ClassLoader每个线程,通过使用Thread.setContextClassLoader()。每个ClassLoader都有独立的类定义,所以这样也许可以达到你想要的结果。

0

不是直接访问该类,而是将其加载到新的ClassLoader中,然后通过反射调用您感兴趣的方法。 static字段的更改将仅反映在ClassLoader中的类的副本中。你可以处理它,然后再次加载该类并再次调用。

这是一个有点反思的工作,当然不是一个长期的解决方案,但是你可以通过操纵哪个ClassLoader来隔离一个班级。

+0

我喜欢的类加载器选项,但使用反射是不是一种选择我。我需要尽可能多的表现。 – paradigmatic

+0

你不会有选择 - 你必须使用反射来调用'Class'。也就是说,你不能在你的代码中直接触摸这个类。但是,这只是最初的调用,必须通过反射进行。反思也不是那么慢。当然,如果这是重要的代码,你需要正确地重写它,而不是包扎它! –