Как вызвать частный статический метод с использованием отражения (Java)?

Я хотел бы вызвать частный статический метод. У меня есть свое имя. Я слышал, что это можно сделать, используя механизм отражения Java. Как мне это сделать?

EDIT: Одна из проблем, с которыми я столкнулась при попытке вызвать метод, – указать тип аргумента. Мой метод получает один аргумент, а его тип – Map. Поэтому я не могу сделать Map.TYPE (во время выполнения нет такой вещи, как Map из-за стирания типа Java). Есть ли другой способ получить метод?

5 Solutions collect form web for “Как вызвать частный статический метод с использованием отражения (Java)?”

Предположим, вы хотите вызвать MyClass.myMethod (int x);

 Method m = MyClass.class.getDeclaredMethod("myMethod", Integer.TYPE); m.setAccessible(true); //if security settings allow this Object o = m.invoke(null, 23); //use null if the method is static 

Вызов основного из урока отражения

 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; public class InvokeMain { public static void main(String... args) { try { Class< ?> c = Class.forName(args[0]); Class[] argTypes = new Class[] { String[].class }; Method main = c.getDeclaredMethod("main", argTypes); String[] mainArgs = Arrays.copyOfRange(args, 1, args.length); System.out.format("invoking %s.main()%n", c.getName()); main.invoke(null, (Object)mainArgs); // production code should handle these exceptions more gracefully } catch (ClassNotFoundException x) { x.printStackTrace(); } catch (NoSuchMethodException x) { x.printStackTrace(); } catch (IllegalAccessException x) { x.printStackTrace(); } catch (InvocationTargetException x) { x.printStackTrace(); } } } 

Нет, вы не можете сказать Map.class . Это из-за стирания типа . Во время выполнения такой вещи нет.

К счастью, вы можете сказать просто старый Map.class . Это все равно во время выполнения.

Если предупреждения вас беспокоят, ищите другие вопросы, связанные с дженериками и стиранием стилей, здесь есть масса информации по этому вопросу.

Я использую единственный метод, который инкапсулирует получение целевого метода и затем вызывает его. Наверное, есть некоторые ограничения, конечно. Вот метод, введенный в class и его тест JUnit:

 public class Invoker { /** * Get method and invoke it. * * @author jbetancourt * * @param name of method * @param obj Object to invoke the method on * @param types parameter types of method * @param args to method invocation * @return return value * @throws Exception for unforseen stuff */ public static final  Object invokeMethod(final String name, final T obj, final Class< ?>[] types, final Object... args) throws Exception { Method method = obj.getClass().getDeclaredMethod(name, types); method.setAccessible(true); return method.invoke(obj, args); } /** * Embedded JUnit tests. */ @RunWith(JUnit4.class) public static class InvokerTest { /** */ @Test public void testInvoke() throws Exception { class TestTarget { private String hello() { return "Hello world!"; } } String actual = (String) Invoker.invokeMethod("hello", new TestTarget(), new Class< ?>[] {}); String expected = "Hello world!"; assertThat(actual, is(expected)); } } 

}

 Object insecure; //This needs to be an initialized reference Class c = insecure.getClass(); Method m = c.getMethod(name, parameterTypes); //Fill the name and types in m.setAccessible(true); m.invoke( insecure, parameters ); //Fill in the parameters you would like 

Существует ряд проверенных исключений, которые могут быть выбраны. Оба параметра и параметры – это эллиптические аргументы (переменная длина), заполняя их по мере необходимости. JVM по спецификации имеет строго типизированное соглашение о вызовах, поэтому вам нужно знать типы параметров.

С учетом сказанного, если вы не пишете какой-либо контейнер приложения, контейнер компонент сервера, RMI-подобную систему или Jang на основе JVM, вам следует избегать этого.

  • Неплохо ли использовать рефлексию в модульном тестировании?
  • Получить общий метод без использования GetMethods
  • C # reflection - загрузить сборку и вызвать метод, если он существует
  • Как использовать метод отражения для вызова по имени
  • Есть что-то вроде instanceOf (class C) в Java?
  • Как перечислить все функции в модуле Python?
  • Как получить значение свойства на основе имени
  • Поиск параметров типа через reflection в Scala 2.10?
  • Быстрое создание объектов вместо Activator.CreateInstance (type)
  • Получение имени параметра метода
  • Поиск различий свойств между двумя объектами C #
  • Давайте будем гением компьютера.