简体   繁体   English

Java newInstance传递args [1]…args [args.length]

[英]Java newInstance passing args[1]…args[args.length]

(Aside: I'm a Perl programmer and, as you can tell, this is my first non-trivial Java program. Simple terms would be appreciated.) (此外:我是一个Perl程序员,正如您所知道的,这是我的第一个简单的Java程序。简单的用语将不胜感激。)

I have the following launcher as coded working: 我有以下启动器已编码工作:

import java.lang.reflect.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebDriver;

/*
    The following class was cobbled together by a Perl guy ...
*/
class LaunchOnLocal {

    public static void main(String[] args) {
        System.err.println("LaunchOnLocal.main ...");
        WebDriver driver=new FirefoxDriver();
        try {
            // The following works but passes arg[0] to the constructor ..
            Object o=createObject(Class.forName(args[0]).getConstructor(new Class[] {WebDriver.class, String[].class}),new Object[] {driver,args});
            /* Fails ... Here I'm trying NOT to pass arg[0]
            String[] passingArgs=new String[args.length-1];
            System.arraycopy(args,1,passingArgs,0,passingArgs.length);
            Object[] passingArgsArray={passingArgs};
            Object o=createObject(Class.forName(args[0]).getConstructor(new Class[] {WebDriver.class, String[].class}),new Object[] {driver,passingArgsArray});
            */
             }
        catch (ClassNotFoundException e) {
            e.printStackTrace(System.err);
             }
        catch (NoSuchMethodException e) {
            e.printStackTrace(System.err);
             }
        finally {
            driver.close();
            driver.quit();
            System.err.println("... LaunchOnLocal.main");
             };
         }; // main:

    public static Object createObject(Constructor constructor,Object[] arguments) {
        System.err.println("LaunchOnLocal.createObject ...");
        System.err.println("Constructor: "+constructor.toString());
        Object object=null;
        try {
            object=constructor.newInstance(arguments);
            System.err.println("Object: "+object.toString());
            //return object;
             }
        catch (InstantiationException e) {
            e.printStackTrace(System.err);
             }
        catch (IllegalAccessException e) {
            e.printStackTrace(System.err);
             }
        catch (IllegalArgumentException e) {
            e.printStackTrace(System.err);
             }
        catch (InvocationTargetException e) {
            e.getCause.printStackTrace(System.err);
             }
        finally {
            System.err.println("... LaunchOnLocal.createObject");
            return object;
             }
         }; // createPbkect:

     }; // LaunchOnLocal:
/*
*/

As coded the launcher passes all of its arguments "args" to the app being launched. 按照编码,启动器将其所有参数“ args”传递给正在启动的应用程序。 I need to remove args[0] before passing args. 我需要在传递args之前删除args [0]。 I've tried with the code that's commented out but that fails with 我已经尝试了注释掉的代码,但是失败了

java LaunchOnLocal Test one two
LaunchOnLocal.main ...
LaunchOnLocal.createObject ...
Constructor: public Test(org.openqa.selenium.WebDriver,java.lang.String[]) throws java.lang.InterruptedException
java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at LaunchOnLocal.createObject(LaunchOnLocal.java:41)
        at LaunchOnLocal.main(LaunchOnLocal.java:20)
... LaunchOnLocal.createObject
... LaunchOnLocal.main

For completeness I include the app being launched: 为了完整起见,我包括正在启动的应用程序:

import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebDriver;

public class Test {

    public Test (WebDriver driver, String[] args) throws InterruptedException {
        System.out.println("Test.Test ...");

        for (String arg: args) {
            System.out.println(arg);
             };

        driver.navigate().to("http://www.sojicity.com/");
        Thread.sleep(10000);
        // Just so we can crash!
        int i=1;
        //i=0; // uncomment this line to cause an error
        i=i/i;
        System.out.println("... Test.Test.");
         }; // Test:

     }; // Test:

What am I doing incorrectly that I can not successfully pass args after shifting? 我在转换后无法成功传递args,这是我做错了什么?

The correction that fge proposes works! fge建议的更正工作! Changed

Object o=createObject(Class.forName(args[0]).getConstructor(new Class[] {WebDriver.class, String[].class}),new Object[] {driver,args});

to

Object o=createObject(Class.forName(args[0]).getConstructor(new Class[] {WebDriver.class, String[].class}),new Object[] {driver,Arrays.copyOfRange(args, 1, args.length)});

Try and use: 尝试使用:

Arrays.copyOfRange(args, 1, args.length)

instead. 代替。 This is much more simple and will use System.arrayCopy() internally anyway. 这要简单得多,并且无论如何都会在内部使用System.arrayCopy()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM