【问题标题】:Java Reflection : invoking inherited methods from child classJava反射:调用从子类继承的方法
【发布时间】:2017-03-20 10:40:06
【问题描述】:

在我的应用程序中,我有以下结构:

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);
     }
}

在上述调用中,当我从ChildClass 的对象调用method1 时,它会抛出java.lang.NoSuchMethodException

在实际场景中,ParentClass 有数百个方法,它们的工作方式类似于主存储库,我们为每个客户端创建单独的 ChildClass 并覆盖客户端特定更改的方法。

有没有办法从子类对象调用父类的方法(未被覆盖)?

【问题讨论】:

  • 那是因为您使用的是getDeclaredMethod(),但您的ChildClass 没有声明该方法。你的ParentClass确实如此。考虑改用getMethod

标签: java inheritance reflection nosuchmethoderror


【解决方案1】:

您需要使用getMethod(String name, Class&lt;?&gt;... parameterTypes) 而不是getDeclaredMethod

【讨论】:

    【解决方案2】:

    如果继承的函数是private,可以使用:

    clazz.getSuperclass().getDeclaredMethod(String name, Class<?>... parameterTypes);
    

    【讨论】:

    • 谢谢。这正是我想要的
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多