Если у меня есть две переменные:
Object obj;
String methodName = "getName";
Не зная класса obj
, как я могу вызвать метод, указанный methodName
на нем?
Вызываемый метод не имеет параметров и String
возвращаемого значения. Это геттер для Java-бина .
java
reflection
invoke
brasskazoo
источник
источник
Ответы:
Кодирование от бедра, это было бы что-то вроде:
Параметры идентифицируют конкретный метод, который вам нужен (если доступно несколько перегруженных версий, если метод не имеет аргументов, только укажите
methodName
).Затем вы вызываете этот метод, вызывая
Опять же, пропустите аргументы
.invoke
, если у вас их нет. Но да Читайте о Java Reflectionисточник
method
inmethod.invoke(obj, arg1, arg2,...);
. аmethod = null;
решает проблему , но упоминания о нем в ответ не плохая идея.invoke
он возвращает все, что вернул. Если при выполнении метода возникает исключение, оно будет заключено вInvocationTargetException
.Используйте вызов метода из отражения:
Куда:
"class name"
это название классаobjectToInvokeOn
имеет тип Object и является объектом, для которого вы хотите вызвать метод"method name"
это имя метода, который вы хотите вызватьparameterTypes
имеет типClass[]
и объявляет параметры, которые принимает методparams
имеет типObject[]
и объявляет параметры, передаваемые методуисточник
Для тех, кто хочет простой пример кода в Java 7:
Dog
учебный класс:ReflectionDemo
учебный класс:Вывод:
Mishka is 3 year(s) old.
Вы можете вызвать конструктор с параметрами следующим образом:
Кроме того, вы можете удалить
и делать
Предлагаемое чтение: создание новых экземпляров классов
источник
Method
объект?Метод может быть вызван следующим образом. Есть также больше возможностей (проверьте API отражения), но это самый простой:
источник
Во-первых, не надо. Избегайте такого рода кода. Это, как правило, очень плохой код и небезопасный (см. Раздел 6 Руководства по безопасному кодированию для языка программирования Java, версия 2.0 ).
Если вы должны это сделать, предпочтите java.beans рефлексии. Отражение бобов отражает относительно безопасный и обычный доступ.источник
Чтобы завершить ответы моего коллеги, вы можете обратить пристальное внимание на:
Вот старый код java1.4, который учитывает эти моменты:
источник
источник
источник
Если вы делаете вызов несколько раз, вы можете использовать новые дескрипторы метода, представленные в Java 7. Здесь мы рассмотрим ваш метод, возвращающий строку:
источник
invokeExact
когда сможете. Для этого подпись сайта вызова должна точно соответствовать типу дескриптора метода. Обычно требуется немного возиться, чтобы добраться до работы. В этом случае вам нужно привести первый параметр с помощью:,methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
а затем вызвать какString result = (String) methodHandle.invokeExact(obj);
Это звучит как что-то выполнимое с пакетом Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Особенно в разделе Методы вызова по имени:
импорт java.lang.reflect. *;
источник
Индексирование (быстрее)
Вы можете использовать
FunctionalInterface
для сохранения методов в контейнере для их индексации. Вы можете использовать контейнер массива для вызова их по номерам или hashmap для вызова их по строкам. К этой уловке, вы можете индексировать ваши методы , чтобы вызвать их динамически быстрее .Лямбда-синтаксис
Вы также можете использовать лямбда-синтаксис:
источник
O(1)
.SomeClass
это класс иsomeVariable
является переменной.источник
Я делаю это так:
источник
Пожалуйста, обратитесь следующий код может помочь вам.
Спасибо....
источник
Вот ГОТОВЫ ИСПОЛЬЗОВАТЬ МЕТОДЫ:
Чтобы вызвать метод без аргументов:
Чтобы вызвать метод с аргументами:
Используйте вышеуказанные методы, как показано ниже:
Вывод:
источник
Student.java
StudentTest.java
источник
Вы должны использовать отражение - инициализировать объект класса, затем метод в этом классе, а затем вызывать этот метод для объекта с необязательными параметрами. Не забудьте обернуть следующий фрагмент в блок try-catch
Надеюсь, поможет!
источник
Это работает нормально для меня:
}
Вывод:
My input testparam
Я могу вызвать метод, передав его имя другому методу (например, main).
источник
с помощью
import java.lang.reflect.*;
и вот как вы это используете:
источник
С jooR это просто:
Вот более сложный пример:
Это печатает:
источник
для меня довольно простым и надежным способом было бы просто сделать метод вызывающего метода следующим образом:
тогда, когда вам нужно вызвать метод, просто поместите что-то вроде этого
источник
className.getName().toString()
? Вы упускаете весь смысл размышления.