Calling a method using reflection

2019-05-07 10:49发布

问题:

Is it possible to call a method by reflection from a class?

class MyObject {
    ...   //some methods

    public void fce() {
        //call another method of this object via reflection?
    }
}

Thank you.

回答1:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Main
{
    public static void main(final String[] argv)
    {
        final Main main;

        main = new Main();
        main.foo();
    }

    public void foo()
    {
        final Class clazz;
        final Method method;

        clazz = Main.class;

        try
        {
            method = clazz.getDeclaredMethod("bar", String.class);
            method.invoke(this, "foo");
        }
        catch(final NoSuchMethodException ex)
        {
            // handle it however you want
            ex.printStackTrace();
        }
        catch(final IllegalAccessException ex)
        {
            // handle it however you want
            ex.printStackTrace();
        }
        catch(final InvocationTargetException ex)
        {
            // handle it however you want
            ex.printStackTrace();
        }
    }

    private void bar(final String msg)
    {
        System.out.println("hello from: " + msg);
    }
}


回答2:

Absolutely:

import java.lang.reflect.*;

public class Test
{
    public static void main(String args[]) throws Exception
    {
        Test test = new Test();
        Method method = Test.class.getMethod("sayHello");
        method.invoke(test);
    }

    public void sayHello()
    {
        System.out.println("Hello!");
    }
}

If you have problems, post a specific question (preferrably with a short but complete program demonstrating the problem) and we'll try to sort it out.



回答3:

You can.. But there's are probably better ways to do what you're after (?). To call a method via reflection you could do something like -

class Test {

    public void foo() {
        // do something...
    }

    public void bar() {
        Method method = getClass.getMethod("foo");
        method.invoke(this);
    }
}

If the method you want to invoke has arguments then it's slightly different - you need to pass arguments to the invoke method in addition to the object to invoke it on, and when you get the method from the Class you need to specify a list of argument types. i.e. String.class etc.