С отражением Java, как создать экземпляр нового объекта, затем вызвать метод на нем?
Я новичок в Java, и я столкнулся с проблемой рефлексии.
Скажем, мне нужно динамически вызывать метод fooMethod
для экземпляра класса Foobar
Я получил до сих пор экземпляр Foobar
с:
Object instance = Class.forName("Foobar").newInstance();
Скажем, я знаю, есть метод fooMethod
на этом объекте (я даже могу проверить это с помощью Class.forName("Foobar").getDeclaredMethods()
), как его вызвать, пожалуйста?
Ответы
Ответ 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<methods.length();i++)
{
if(method[1].getName().equals("methodNameWeAreExpecting"))
{
method=method[i];
}
}