使用非默认构造函数进行动态类实例化

时间:2013-04-11 21:16:41

标签: java reflection jruby

我正在尝试动态实例化一个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。

我在这个问题上的斗智尽头。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您需要将(Java)String数组传递给get_declared_constructor以检索正确的构造函数,然后在调用newInstance时将该数组作为对象传递:

# 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)