Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Java Invoking a method using Reflection is not able to find method, when method has baseclass as parameter

Below is the code snippet, I am trying to invoke the usingClass method using REFLECTION. Calling the usingClass() method directly(w/o reflection) works when I pass an object of type Child, though when I try to achieve the same thing using Reflection it throws NoSuchMethodFoundException. Would like to understand if I am missing something or is there any logic behind this? Please help

package Reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethodInvocation {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestMethodInvocation test = new TestMethodInvocation();
        Child child = new Child();
        Parent parent = (Parent)child;
        Class<? extends Parent> argClassType = parent.getClass();
        Class<? extends TestMethodInvocation>  thisClassType = test.getClass();

        test.usingClass(child);

        Method methodToCall;
        try {
            methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType);
            methodToCall.invoke(test, parent);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void usingClass(Parent p){
        System.out.println("UsingClass: " + p.getClass());
    }


}

Output is as below.

UsingClass: class Reflection.Child
java.lang.NoSuchMethodException: Reflection.TestMethodInvocation.usingClass(Reflection.Child)
    at java.lang.Class.getDeclaredMethod(Unknown Source)
    at Reflection.TestMethodInvocation.main(TestMethodInvocation.java:20)
like image 530
user1448281 Avatar asked Apr 13 '26 12:04

user1448281


2 Answers

The reason your code does not work is that getClass() is dynamically bound. Casting to Parent does not affect the runtime type of your object and so the variables child and parent contain the same class object. Unless you explicitly query your instance for its parent class via getGenericSuperclass() or something similar, you will have to use the static way mentioned by dystroy.

like image 138
Jochen Avatar answered Apr 16 '26 02:04

Jochen


You should use

methodToCall = thisClassType.getDeclaredMethod("usingClass", Parent.class);

because the precise exact class of parent (which is Child), is used at runtime and the type of the variable holding it changes nothing.

Another (too heavy) way to solve it would be :

Class<? extends Parent> argClassType2 = (new Parent()).getClass();
...
    methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType2);
like image 38
Denys Séguret Avatar answered Apr 16 '26 00:04

Denys Séguret



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!