我有一个Java员工类,我可以使用以下代码获取加载它的磁盘上的位置:
Staff.class.getProtectionDomain().getCodeSource().getLocation();
在一个犹豫不决的jirb会话中,我尝试了以下内容:
Staff.getProtectionDomain()
和(编辑)
Staff.class.getProtectionDomain()
两者都找不到方法:undefined方法`getProtectionDomain'
这个方法是否被jruby掩盖,若然,我怎么称呼它?
[edit]我正在使用jruby 1.5.6。
答案 0 :(得分: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
答案 1 :(得分:0)
我认为它应该是jruby中的Staff.class.getProtectionDomain()。
答案 2 :(得分:0)
所以这里有几个问题(至少它们适合我)。
1)你不能使用类似Staff.class的常量来获取java类 - 这将返回ruby Class对象。
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的实例(在我的问题中的例子中)就像这样:
Staff.new.getClass().getProtectionDomain()