使用反射调用方法

时间:2009-02-19 17:51:58

标签: java reflection

是否可以通过类的反射来调用方法?

class MyObject {
    ...   //some methods

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

谢谢。

3 个答案:

答案 0 :(得分:7)

绝对:

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!");
    }
}

如果您遇到问题,请发布一个特定问题(最好使用简短但完整的程序来证明问题),我们会尝试对其进行排序。

答案 1 :(得分:3)

你可以..但是可能有更好的方法来做你想做的事情(?)。要通过反射调用方法,您可以执行类似的操作 -

class Test {

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

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

如果要调用的方法有参数,那么它稍有不同 - 除了要调用它的对象外,还需要将参数传递给invoke方法,当你从Class中获取方法时,需要指定一个参数类型列表。即String.class等。

答案 2 :(得分:3)

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);
    }
}