Java reflection - Invoking Methods with a Variable Number of Arguments

Hi,

My scenario is such that i have a class that receives the name of a method and the qualified name of the class that contains it. Using this info i get a reference to the method. My problem arises when i want to call that method and pass it parameters. I need to create this class such that i am able to call different methods with varying numbers of params. These params will all be numbers.

e.g. public double meth1(double 1,double 2){}
       public double meth2(double 1,double 2,double 3){}

I know its possible to to do this if all my methods had an array as a param but realistically i cant do this.

Anybody have a solution?

Thanks in advance
public NelderMead(){}
	public double run(String qualifiedClassName,String methodName, double[] startparams,int paranum,double TOL){
		
		
		
		//start reflection
		try{
			Class<?> c = Class.forName(qualifiedClassName);
			
			Method meth=null;;
			
			Method[] allMethods = c.getDeclaredMethods();
			for (Method m : allMethods) {
				String mname = m.getName();
				if (mname.equals(methodName))
					meth=m;	
			}
			
			meth.invoke(startparams);
		}
		catch(ClassNotFoundException e){}
		//catch(NoSuchMethodException n){}
		catch(InvocationTargetException in){Throwable cause = in.getCause();
	    err.format("invocation of %s failed: %s%n","", cause.getMessage());}
		catch(IllegalAccessException il){Throwable cause = il.getCause();
	    err.format("invocation of %s failed: %s%n","", cause.getMessage());}

Open in new window

billyleoAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kevin CrossChief Technology OfficerCommented:
Here is the example from Java website on reflection:
http://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html

If you have any more questions on it, please post back.
0
Kevin CrossChief Technology OfficerCommented:
You can also look for the method by the number of parameters and their types if you actual know coming in what method you are looking for and its signature or at least the parameters you have to pass to it.

try {
                Class c = Class.forName("MainClass");
                Class[] parameterTypes = new Class[2];
                parameterTypes[0] = double.class;
                parameterTypes[1] = double.class;
                c.getMethod("meth1", parameterTypes);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Open in new window

0
billyleoAuthor Commented:
thanks for the input but my problem arises after i get the method that i want to invoke.

I have been reading the link you posted but they only seem to show you how to invoke methods like a 'main' method that thats in an array of params!

Cheers
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Kevin CrossChief Technology OfficerCommented:
I was trying to simplify and my code example was in a class called MainClass.

Here is a better example:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
 
 
public class MyClass {
 
    public MyClass() {
        
    }
    
    public static void main(String args[]) {
        MyClass instance = new MyClass();
        Class c = instance.getClass();
        
        if (args == null || args.length != 2) {
            args = new String[2];
            args[0] = "Test";
            args[1] = "Param";
        }
        List<Class> paramTypes = new ArrayList<Class>();
        for (Object o : args) {
            paramTypes.add(o.getClass());
        }
 
        Method meth=null;;
        
        Method[] allMethods = c.getDeclaredMethods();
        for (Method m : allMethods) {
            String mname = m.getName();
            if (mname.equals("meth1"))
                meth=m; 
        }
        
        try {
            Object o = meth.invoke(instance, args);
            System.out.println(o.toString());
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
 
    public String meth1(String param1, String param2) {
        System.out.println("Param1: " + param1);
        System.out.println("Param2: " + param2);
        return "Hello World";
    }
}

Open in new window

0
Kevin CrossChief Technology OfficerCommented:
If everything else matches what you have, the net is that I think you need an instance of class holding the method to invoke against.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
billyleoAuthor Commented:
Thanks - hopefully this will work - i'll let you know when i get a chance to implement it.

Cheers
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.