2010-12-22 75 views
0

我在Java中的工作人员类,我可以得到它被使用下面的代码加载磁盘上的位置:jruby中的getProtectionDomain()在哪里?

Staff.class.getProtectionDomain().getCodeSource().getLocation(); 

在JRuby的jirb会议上,我尝试了以下内容:

Staff.getProtectionDomain() 

和(编辑)

Staff.class.getProtectionDomain() 

这两者无法找到方法:未定义的方法`getProtectionDomain'

这个方法是否被jruby掩盖了,如果是的话,我怎么称呼它?

我正在使用jruby 1.5.6。

回答

1

JRuby中,你应该使用#protection_domain() - 它存在并按照预期运行 - 而不是getProtectionDomain() - 存在但未按预期工作。

为了完整起见,这里是一个简单的例子:

# use this to get the jruby-complete.jar file 
a_java_class = self.to_java.java_class 
    #=> class org.jruby.RubyObject 
a_java_class.protection_domain.code_source.location.path 
    #=> "/C:/Users/xxx/yyy/jruby-complete-9.0.4.0.jar" 


# use this to get the file path to the commons-lang3-3.4.jar 
require_relative 'java_lib/commons-lang3-3.4.jar' 
a_java_class = Java::org.apache.commons.lang3.SystemUtils.java_class 
    #=> class org.apache.commons.lang3.SystemUtils 
a_java_class.protection_domain.code_source.location.path 
    #=>"/C:/Users/xxx/yyy/zzz/java_lib/commons-lang3-3.4.jar" 

而且,看到这个其他职位与相关信息:Get JRuby jar path

0

我相信它应该是jruby中的Staff.class.getProtectionDomain()。

+1

仍然给我同样的错误。 – 2010-12-29 22:16:31

+0

解决方案:1)员工应该是来自jar文件的* java类*; 2)在jruby中避免使用java方法`#getProtectionDomain()`,而是使用jruby的方法`#protection_domain()`。最后,我们将解释为:`Staff.java_class.protection_domain` – zipizap 2016-02-23 10:48:11

0

所以这里有几个问题(至少它们是我的)。

1)你不能用类似于Staff.class的常量获得java类 - 这将返回ruby类对象。

2)一旦你有一个java实例,你只能使用getClass()方法得到它的java.lang.Class。再次调用类会为您提供来自ruby层次结构的类对象。

x = Java::java.lang.String.new("hi") 
x.class.kind_of?(Java::java.lang.Class) # evaluates to false 
x.getClass().kind_of?(Java::java.lang.Class) # evaluates to true 

这样的话我就必须有工作人员的一个实例(在我的问题的例子)是这样的:

Staff.new.getClass().getProtectionDomain()