繁体   English   中英

使用反射调用方法

[英]Calling a method using reflection

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

class MyObject {
    ...   //some methods

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

谢谢。

绝对:

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

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

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

class Test {

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

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

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

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

暂无
暂无

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

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