2013-04-11 66 views
0

我試圖動態實例化一個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。

我在我的智慧結束這一個。感謝您的幫助。

+0

你從哪裏得到這個錯誤嗎?如果在獲取ctor而不是ruby字符串時使用java字符串會怎樣? – 2013-04-11 21:20:47

+0

嗨Dave,謝謝你的調用:)當我試圖獲取正確的構造函數'l_constructor = l_class_type.getConstructor(Array(String).to_java.class);'時發生錯誤。 – 2013-04-12 08:40:45

+0

嗨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

回答

0

調用newInstance當你需要一個(Java)的字符串數組傳遞給get_declared_constructor檢索正確的構造函數,然後傳遞數組作爲一個對象:

# Get the right constructor 
l_constructor = l_class_type.get_declared_constructor(p_args.to_java(:string).java_class) 
return l_constructor.new_instance(p_args.to_java(:string).to_java_object) 
+0

SalutSébastien,謝謝你的回答。它現在正在工作。我錯過了對'to_java_object'的調用。 – 2013-04-13 13:07:23

+0

謝謝你的幫助:) WolfgangHämmer – 2013-04-13 13:07:41

+0

@wolfganghämmer沒有可能,即使在Java中,工作起來也是一個棘手的問題! – 2013-04-13 13:41:23

相關問題