how to pass multiple parameters to a method in java reflections

前端 未结 4 1560
庸人自扰
庸人自扰 2020-12-30 15:15

Hi i am using reflections to achieve something. I have been given class name, method name of that class and parameter values that needs to be passed to that method in a file

4条回答
  •  庸人自扰
    2020-12-30 15:32

    public class ReflectionSample
    {
        private Object mString = null;
        private int mValue;
    
        public ReflectionSample()
        {
        }
    
        public ReflectionSample(int oValue)
        {
            mValue = oValue;
        }
    
        public ReflectionSample(String oString)
        {
            mString = oString;
        }
    
        public ReflectionSample(String oString, int oValue)
        {
            setValues(oString, oValue);
        }
    
        public void setValues(String oString, int oValue)
        {
            mString = oString;
            mValue = oValue;
        }
    
        public String toString()
        {
            return ""+mString+":"+mValue;
        }
    
        public void run()
        {
            String oInput = "Teststring";
            Class cls;
            String clsname = "main.ReflectionSample";
            Object rs = null;   // ReflectionSample
            Object rsc = null;
    
            System.out.println(this.getClass().getName());
            try
            {
                System.out.println(clsname);
                cls = Class.forName(clsname);
                if(cls == null)
                {
                    System.err.println(clsname + " doesn't exist");
                    return;
                }
    
                // Look for a constructor which has a single string
                Constructor ct = null;
                Class[] param_types = new Class[1];
                Object[] arguments = new Object[1];
    
                param_types[0] = String.class;
    
                // get the string constructor
                ct = cls.getConstructor(param_types);
    
                // We only have one object
                arguments = new Object[1];
                arguments[0] = oInput;
    
                // Instantiate the object with passed in argument.
                rs = ct.newInstance(arguments);
                System.out.println("String constructor sample: "+rs);
    
                // Instantiate with default constructor
                param_types = new Class[0];
                arguments = new Object[0];
                ct = cls.getConstructor(param_types);
                rs = ct.newInstance(arguments);
                rsc = rs; // Keep it for later, to lazy to call it again
                System.out.println("Default constructor sample: "+rs);
    
                // Instantiate with string and int constructor
                param_types = new Class[2];
                arguments = new Object[2];
    
                // Must be in the same order as the params I think
                param_types[0] = String.class;
                param_types[1] = Integer.TYPE;      // <-- Its a primitive so use TYPE not Class
    
                arguments[0] = oInput;
                arguments[1] = new Integer(1);
    
                ct = cls.getConstructor(param_types);
                rs = ct.newInstance(arguments);
                System.out.println("String plus int constructor sample: "+rs);
    
                // call the setValues method
                param_types[0] = String.class;
                param_types[1] = Integer.TYPE;      // <-- Its a primitive so use TYPE not Class
    
                arguments[0] = oInput;
                arguments[1] = 1;
    
                System.out.println("setValues invocation before: "+rsc);
                Method m = cls.getMethod("setValues", param_types);
                m.invoke(rsc, arguments);
                System.out.println("setValues invocation after: "+rsc);
    
                // An alternative method to pass the parameters
                m = cls.getMethod("setValues", String.class, Integer.TYPE);
                m.invoke(rsc, oInput+"x", 2);
                System.out.println("setValues invocation after: "+rsc);
            }
            catch(Throwable e)
            {
                System.err.println(e.getLocalizedMessage());
            }
        }
    }
    

    Output:

    main.ReflectionSample
    main.ReflectionSample
    String constructor sample: Teststring:0
    Default constructor sample: null:0
    String plus int constructor sample: Teststring:1
    setValues invocation before: null:0
    setValues invocation after: Teststring:1
    

    Hope this helps.

    I don't know if this is a newer feature in Java, but I have seen that you can use invoke now with parameters as well, instead of using an array, which might make your code better to read (This is the alternative way). If you need a variable number of arguments and you don't know beforehand how many there will be, allocating the array is defeinitly working and should also be backwardcompatible.

提交回复
热议问题