Java Reflection вызов метода с общими параметрами - PullRequest
1 голос
/ 21 сентября 2019

Как вызвать метод через Reflection, если у него есть универсальный параметр, например, нижеприведенный фрагмент -

@Test
    public void testOptional() throws NoSuchMethodException, InvocationTargetException,
            IllegalAccessException
    {
        AtomicReference<ClassA> atomicReference = new AtomicReference<>(new ClassA());
        ClassB classB = new ClassB();

        Method method = MyTest.class.getDeclaredMethod("doSomething", AtomicReference.class, ClassB.class);
        method.setAccessible(true);
        method.invoke(atomicReference, classB);
    }

    private void doSomething(AtomicReference<ClassA> classA, ClassB classB){

        System.out.println("Hi do not poke me, I am working!");
    }

Это дает мне -

java.lang.IllegalArgumentException: object is not an instance of declaring class

1 Ответ

2 голосов
/ 21 сентября 2019

doSomething метод является частью класса MyTest.Method::invoke будет принимать три параметра:

  • экземпляр класса MyTest, для которого будет вызван метод.
  • экземпляр AtomicReference
  • экземпляр ClassB

Так что это должно выглядеть так:

public void testOptional() throws NoSuchMethodException, InvocationTargetException,
            IllegalAccessException, InvocationTargetException {
        AtomicReference<ClassA> atomicReference = new AtomicReference<>(new ClassA());
        ClassB classB = new ClassB();

        MyTest myTest = new MyTest(); // here we create the object

        Method method = MyTest.class.getDeclaredMethod("doSomething", AtomicReference.class, ClassB.class);
        method.setAccessible(true);
        method.invoke(myTest, atomicReference, classB); //we invoke doSomething on myTest object with parameters
}

Также имейте в виду, что генерики стираются во время компиляции.Таким образом, каждый универсальный тип является Object во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...