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

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

EDIT: Одна из проблем, с которыми я столкнулась при попытке вызвать метод, – указать тип аргумента. Мой метод получает один аргумент, а его тип – Map. Поэтому я не могу сделать Map.TYPE (во время выполнения нет такой вещи, как Map из-за стирания типа 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, вам следует избегать этого.

  • Как передать функцию в качестве параметра в C #?
  • Как десериализация WCF создает объекты без вызова конструктора?
  • Почему TargetInvocationException рассматривается как неотображаемое средой IDE?
  • Как перечислить все переменные classа
  • Создание classа из строки и создание экземпляра в Scala 2.10
  • GetProperties () возвращает все свойства иерархии наследования интерфейса
  • Как использовать reflection для вызова общего метода?
  • Как скопировать значение из classа X в class Y с тем же именем свойства в c #?
  • Загрузка DLL-файлов во время выполнения в C #
  • получение типа T из IEnumerable
  • Как узнать, какой тип каждого объекта находится в ArrayList ?
  • Давайте будем гением компьютера.