Java Reflection: вызов унаследованных методов из дочернего класса

В моем приложении у меня есть следующая структура:

public class ParentClass{
    public void method1()
    {....}

    public void method2()
    {....}

    public void method3()
    {....}

    public void method4()
    {....}

    public void method5()
    {....}
}

public class ChildClass extends ParentClass{
    public void method3()
    {....}

    public void method4()
    {....}
}


//I have exported the above class in a jar file.
//--------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX---------------------------

public class TestClass{
     public static void main(String args[]) {
        String jarpath = "jar path of the above class"
        File jarFile = new File(jarpath);
        URLClassLoader classLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()},Thread.currentThread().getContextClassLoader());
        Class<?> dynamicClass = (Class<?>) classLoader.loadClass("packageName.ChildClass");
        Constructor<?> cons = dynamicClass.getConstructor();
        classObject = cons.newInstance();
        Method method = obj2.getClass().getDeclaredMethod("method1",null);
        method.invoke(obj2);
     }
}

В приведенном выше вызове, когда я вызываю method1 из объекта ChildClass, он выдает java.lang.NoSuchMethodException.

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

Есть ли способ вызвать метод (который не переопределяется) родительского класса из объекта дочернего класса?


person BhushanK    schedule 20.03.2017    source источник
comment
Это потому, что вы используете getDeclaredMethod(), но ваш ChildClass не объявляет метод. Ваш ParentClassделает. Вместо этого рассмотрите возможность использования getMethod.   -  person mcuenez    schedule 20.03.2017


Ответы (2)


Вам нужно использовать getMethod(String name, Class<?>... parameterTypes) вместо getDeclaredMethod

person Andrew McGuinness    schedule 20.03.2017

Если унаследованная функция private, вы можете использовать:

clazz.getSuperclass().getDeclaredMethod(String name, Class<?>... parameterTypes);
person tresf    schedule 07.01.2020