java判断class子类或父类的实例方法

要判断Java中的一个实例方法属于其父类还是子类,可以通过利用Java反射API中的getDeclaredMethod()方法实现。

首先,在Java中,一个对象的所属类可以通过instanceof关键字来判断。但是,如果需要定位该实例方法是被哪个类所声明的,就需要使用Java反射API了。要使用Java反射API获取方法,需要使用Class类的 getDeclaredMethod(String methodName, Class<?>... parameterTypes) 方法。该方法返回一个Method类型的对象,可以使用该对象提供的isAnnotationPresent(Class<? extends Annotation> annotationClass)方法来判断该方法是否被某个注解修饰。如果要判断该方法是否在子类中实现的,则需要获取子类的Class对象并使用该对象的getMethod(String name, Class<?>... parameterTypes)方法获取该方法,在使用Method类提供的getDeclaringClass()方法获取该方法所属的类。

以下是两个示例说明:

示例一

public class SuperClass {
    public void display() {
        System.out.println("This is the display method of superclass");
    }
}

public class SubClass extends SuperClass {
    public void display() {
        System.out.println("This is the display method of subclass");
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        SubClass subObj = new SubClass();
        SuperClass superObj = new SuperClass();

        Method subMethod = subObj.getClass().getDeclaredMethod("display");
        Method superMethod = superObj.getClass().getDeclaredMethod("display");

        System.out.println("The method display() in SubClass is overrided: " + subMethod.toString());
        System.out.println("The method display() in SuperClass is not overrided: " + superMethod.toString());
    }
}

在这个示例中,我们定义了一个父类 SuperClass和一个子类 SubClass,并将 display() 方法在子类中重写。在 Test 类中,我们实例化了 SubClassSuperClass 的对象,并使用 getDeclaredMethod() 方法获取了这两个类中的 display() 方法。然后,我们打印输出了这两个方法的名称和是否被重写的信息。输出结果为:

The method display() in SubClass is overrided: public void practice.SubClass.display()
The method display() in SuperClass is not overrided: public void practice.SuperClass.display()

可以看到,子类中的 display() 方法被重写了,而父类中的 display() 方法没有被重写。因此,这两个方法所属的类也不同。

示例二

public class SuperClass {
}

public class SubClass extends SuperClass {
    public void display() {
        System.out.println("This is the display method of subclass");
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        SubClass subObj = new SubClass();
        SuperClass superObj = new SuperClass();

        Method subMethod = subObj.getClass().getDeclaredMethod("display");
        Method superMethod = superObj.getClass().getMethod("display");

        System.out.println("The method display() in SubClass is not declared in SuperClass: " + subMethod.getDeclaringClass());
        System.out.println("The method display() in SuperClass has no implementation: " + superMethod.getDeclaringClass());
    }
}

在这个示例中,我们定义了一个父类 SuperClass 和一个子类 SubClass,子类中定义了 display() 方法,但是父类中没有该方法的声明。在 Test 类中,我们实例化了 SubClassSuperClass 的对象,并使用 getDeclaredMethod() 方法获取了子类中 display() 方法的 Method 对象,使用 getMethod() 方法获取了父类中 display() 方法的 Method 对象。然后,我们打印输出了这两个方法所属的类。输出结果为:

The method display() in SubClass is not declared in SuperClass: class practice.SubClass
Exception in thread "main" java.lang.NoSuchMethodException: practice.SuperClass.display()
    at java.base/java.lang.Class.getDeclaredMethod(Class.java:2450)
    at practice.Test.main(Test.java:17)

可以看到,由于父类中没有 display() 方法声明,因此在父类中使用 getMethod() 方法获取该方法时会抛出 NoSuchMethodException 异常。而在子类中可以使用 getDeclaredMethod() 方法获取 display() 方法,但是该方法并不属于父类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java判断class子类或父类的实例方法 - Python技术站

(1)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • iPhone 13系列机型如何强制重启 iPhone 13系列强制重启方法

    当 iPhone 13 系列发生卡顿或无响应的情况时,我们需要强制重启。下面介绍 iPhone 13 系列机型的强制重启方法。 iPhone 13系列强制重启方法步骤 按下音量上键:按住 iPhone 右侧的音量上键,不要松手。 按下音量下键:随后按住 iPhone 右侧的音量下键,两个键一直按住不放。 按住侧面键:继续按住两个音量按钮的同时,也按住 iPh…

    other 2023年6月26日
    00
  • Android 图文详解Binder进程通信底层原理

    Android 图文详解Binder进程通信底层原理 介绍 Binder是Android系统中用于进程间通信(IPC)的机制。它提供了一种高效、安全和可靠的方式,使不同进程之间能够进行通信。本攻略将详细讲解Binder进程通信的底层原理,并提供两个示例来说明。 Binder的基本概念 在理解Binder的底层原理之前,我们先来了解一些基本概念。 1. Bin…

    other 2023年8月2日
    00
  • readystatechange事件

    以下是“readystatechange事件的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: readystatechange事件 readystatechange事件是XMLHttpRequest对象的一个事件,用于检测XMLHttpRequest对象的状态。当XMLHttpRequest对象的状态发生变化时,readystatecha…

    other 2023年5月10日
    00
  • 让服务器支持中文文件名下载的设置方法

    为了让服务器支持中文文件名的下载,通常需要进行一些配置。下面是一些常用的配置方法。 Apache服务器配置 如果你使用的是Apache服务器,可以在httpd.conf配置文件中添加以下内容来支持中文文件名下载: AddDefaultCharset UTF-8 AddCharset GB2312 .gb2312 .gb 其中,第一行让服务器默认使用UTF-8…

    other 2023年6月26日
    00
  • C#开发Winform实现窗体间相互传值

    下面是详细讲解“C#开发Winform实现窗体间相互传值”的完整攻略: 目录 背景与前置知识 方法一:通过构造函数传参 示例1:从FormA传递数据到FormB 示例2:从FormB传递数据到FormA 方法二:通过属性传参 示例1:从FormA传递数据到FormB 示例2:从FormB传递数据到FormA 总结 背景与前置知识 C#是一门流行的面向对象编程…

    other 2023年6月27日
    00
  • Python实现批量修改文件名实例

    下面是 Python 实现批量修改文件名的完整攻略。 1. 获取文件夹所有文件名 首先,我们需要获取指定文件夹下的所有文件名。可以使用 Python 内置的 os 库,使用 os.listdir() 方法获取文件夹内所有文件的名称(不包括子文件夹),返回值是一个列表。 import os # 指定文件夹路径 folder_path = "/path…

    other 2023年6月26日
    00
  • C语言头文件<string.h>函数详解

    C语言头文件<string.h>函数详解 介绍 标准 C 库提供了许多有用的函数,其中很多函数都包含在头文件 <string.h> 中。这些函数主要用于处理字符串,包括字符串的拷贝、比较、重复、搜索、分割、连接等操作。 函数列表 下面是 <string.h> 中常用的函数列表: 函数名 返回值 功能描述 strcpy char* 将一…

    other 2023年6月27日
    00
  • 自动化工具:win32gui使用方法

    自动化工具win32gui使用方法 Win32gui是Python中的一个第三方库,可以用于Windows 应用程序的自动化操作。Win32gui库使用win32 API的底层功能,可以处理Windows控件、窗口消息等操作。本文将介绍Win32gui的基本用法,帮助初学者快速上手。 Win32gui的安装 在使用 Win32gui 库之前,需要在本地系统上…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部