我試圖動態實例化一個Java類,給定的絕對路徑的jar文件和類的名稱。具體我想這個java類實例:動態類實例與非默認構造函數
public Tool(String[] args) {
this.args = args;
errMgr = new ErrorManager(this);
errMgr.setFormat(msgFormat);
handleArgs();
}
我一直在嘗試以下操作:
require 'java';
java_import 'java.io.File';
java_import 'java.net.URL';
java_import 'java.net.URLClassLoader';
class JarLoader
def self.load_class(p_jar_path, p_class_name, p_args)
# p_jar_path: absolute path to jat
l_jar_url = File.new(p_jar_path).toURL;
l_url_arr = Array[l_jar_url].to_java(java.net.URL);
l_class_loader = JavaNet::URLClassLoader.new(l_url_arr);
# p_class_name: name of the class
l_class_type = l_class_loader.loadClass(p_class_name);
# Get the right constructor
l_constructor = l_class_type.getConstructor(Array(String).to_java.class);
return l_constructor.newInstance(p_args.to_java(:string));
end
end
我得到的錯誤
Java::JavaLang::NoSuchMethodException: org.antlr.v4.Tool.<init>([Ljava.lang.Object;)
不知何故,參數的構造函數結束屬於錯誤的類型。 我使用java jdk 1.5(因爲我需要使用oracle 11g db)和jruby 1.7.1。
我在我的智慧結束這一個。感謝您的幫助。
你從哪裏得到這個錯誤嗎?如果在獲取ctor而不是ruby字符串時使用java字符串會怎樣? – 2013-04-11 21:20:47
嗨Dave,謝謝你的調用:)當我試圖獲取正確的構造函數'l_constructor = l_class_type.getConstructor(Array(String).to_java.class);'時發生錯誤。 – 2013-04-12 08:40:45
嗨Dave,這是工作 'l_constructor = l_class_type.getConstructor(l_args.to_java(:string).class)'。我得到正確的構造函數。 'l_constructor.to_s'返回「public org.antlr.v4.Tool(java.lang.String [])」。不過,調用這個構造函數'l_constructor.newInstance(l_args.to_java(:string))會失敗,並帶有IllegalArgumentEXception。 – 2013-04-12 08:45:38