Подтвердить что ты не робот

С отражением Java, как создать экземпляр нового объекта, затем вызвать метод на нем?

Я новичок в Java, и я столкнулся с проблемой рефлексии.

Скажем, мне нужно динамически вызывать метод fooMethod для экземпляра класса Foobar

Я получил до сих пор экземпляр Foobar с:

Object instance = Class.forName("Foobar").newInstance();

Скажем, я знаю, есть метод fooMethod на этом объекте (я даже могу проверить это с помощью Class.forName("Foobar").getDeclaredMethods()), как его вызвать, пожалуйста?

4b9b3361

Ответ 1

Method method = getClass().getDeclaredMethod("methodName");
m.invoke(obj);

Это в том случае, если метод не имеет аргументов. Если это так, добавьте типы аргументов в качестве аргументов этого метода. obj - объект, на который вы вызываете метод.

См. документы java.lang.Class

Ответ 2

Чисто отражение: Method.invoke. Другое решение - потребовать, чтобы элемент, который вы отражаете, создает для реализации известного интерфейса и передает его в этот интерфейс и использует его как обычно.

Последнее обычно используется для "плагинов", первое не используется очень часто.

Ответ 3

Вы можете начать с чтения об этом здесь.

Что касается кода, который вы делаете после него (из того же ресурса):

Method[] allMethods = c.getDeclaredMethods();
    for (Method m : allMethods) {
    String mname = m.getName();
    if (!mname.startsWith("test")
        || (m.getGenericReturnType() != boolean.class)) {
        continue;
    }
    Type[] pType = m.getGenericParameterTypes();
    if ((pType.length != 1)
        || Locale.class.isAssignableFrom(pType[0].getClass())) {
        continue;
    }

    out.format("invoking %s()%n", mname);
    try {
        m.setAccessible(true);
        Object o = m.invoke(t, new Locale(args[1], args[2], args[3]));
        out.format("%s() returned %b%n", mname, (Boolean) o);

    // Handle any exceptions thrown by method to be invoked.
    } catch (InvocationTargetException x) {
        Throwable cause = x.getCause();
        err.format("invocation of %s failed: %s%n",
               mname, cause.getMessage());
    }

Ответ 4

Это должно сработать для вас:

((Foobar)instance).fooMethod()

Ответ 5

Вы можете использовать Reflection

образец класса

package com.google.util;
Class Maths
{

public Integer doubleIt(Integer a)
{
return a*2;
}
}

и использовать SomeThing Like This -

шаг 1: - Загрузить класс с заданным именем ввода как String

Class<?> obj=Class.forName("Complete_ClassName_including_package");

//like:- Class obj=Class.forName("com.google.util.Maths"); 

шаг 2: - получить метод с заданным именем и типом параметра

Method method=obj.getMethod("NameOfMthodToInvoke", arguments);

//arguments need to be like- java.lang.Integer.class
//like:- Method method=obj.getMethod("doubleIt",java.lang.Integer.class);

Шаг 3: - Вызывать метод. Передавая экземпляр объекта и аргумента

Object obj2=    method.invoke(obj.newInstance(), id);
//like :- method.invoke(obj.newInstance(), 45);

ВЫ МОЖЕТЕ СДЕЛАТЬ ШАГ 2, КАК ЭТО ТАКЖЕ

(когда вы не знаете, какой конкретный метод существует в классе, который вы проверяете весь метод методом looping array)

Method[] methods=obj.getMethods();

Method method=null;

for(int i=0;i&lt;methods.length();i++)

{

if(method[1].getName().equals("methodNameWeAreExpecting"))

{ 

method=method[i];

}

}