Вызов метода с использованием отражения - PullRequest
4 голосов
/ 19 февраля 2009

Можно ли вызвать метод путем отражения от класса?

class MyObject {
    ...   //some methods

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

Спасибо.

Ответы [ 3 ]

7 голосов
/ 19 февраля 2009

Абсолютно:

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

Если у вас есть проблемы, опубликуйте конкретный вопрос (желательно с короткой, но полной программой, демонстрирующей проблему), и мы постараемся решить ее.

3 голосов
/ 19 февраля 2009
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);
    }
}
3 голосов
/ 19 февраля 2009

Вы можете .. Но, возможно, есть лучшие способы сделать то, что вы ищете (?). Чтобы вызвать метод через отражение, вы можете сделать что-то вроде -

class Test {

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

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

Если метод, который вы хотите вызвать, имеет аргументы, то он немного отличается - вам нужно передать аргументы методу invoke в дополнение к объекту, для которого он вызывается, а когда вы получаете метод из Class, вам нужно указать список типов аргументов. то есть класс String и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...