更改类加载器JRuby在块中使用

时间:2012-09-27 00:41:16

标签: jruby classloader

我想直接与JRuby集成,因此可以在子类ClassLoader中调用块。

目标是将要传递给custom ClassLoader的Jars列表加载以执行块。我遇到的问题是告诉JRuby运行时使用新的ClassLoader而不是默认值。我现在拥有的是一个黑客,它手动调用create(string class)来使用自定义ClassLoader构建实例。

对于RubyLockJar使用example从文件tmp/IsolateJarfile.lock获取Jars列表,{{3}}如何使用它:

email = LockJar::ClassLoader.new( 'tmp/IsolateJarfile.lock' ).isolate do
    email = new_instance( 'org.apache.commons.mail.SimpleEmail' )
    email.setSubject( 'test subject' )
    email
end

email.getSubject().should eql 'test subject'

这很有效,SimpleEmail是在子ClassLoader中创建的。默认的JRuby类路径不会更改。对new_instance( 'org.apache.commons.mail.SimpleEmail' )的调用很难看。理想情况下,可以调用org.apache.commons.mail.SimpleEmail.new,JRuby运行时将从自定义类加载器而不是默认的JRuby类加载器中提取。我尝试在块执行期间更改Thread.currentThread().setContextClassLoader,但这不起作用。我在JRuby源码周围窥探了一些,但无法想出一个挂钩ClassLoader的好方法。

0 个答案:

没有答案