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日

相关文章

  • PHP根据IP地址获取所在城市具体实现

    PHP根据IP地址获取所在城市具体实现攻略 1. 获取IP地址 首先,我们需要获取用户的IP地址。在PHP中,可以使用$_SERVER[‘REMOTE_ADDR’]来获取用户的IP地址。例如: $ip = $_SERVER[‘REMOTE_ADDR’]; 2. 发送请求获取城市信息 接下来,我们需要向IP地址查询接口发送请求,以获取IP地址对应的城市信息。有…

    other 2023年7月30日
    00
  • Highchart基础教程-图表的主要组成

    下面是“Highchart基础教程-图表的主要组成的完整攻略”,包括图表的主要组成、使用方法、两个示例说明等方面。 图表的主要组成 Highchart是一个基于JavaScript的图表库,它可以用来创建各种类型的图表,包括线图、柱状图、饼图等。一个Highchart图表主要由以下几个组成部分: 标题:用于描述图表的主题或主要内容。 坐标轴:用于显示数据的坐…

    other 2023年5月5日
    00
  • IOS中自定义类中限制使用原生实例化方法

    在iOS开发中,我们可以使用原生的实例化方法(即alloc和init方法)来创建对象。但是在一些特殊情况下,我们可能需要对类进行定制化,限制使用原生实例化方法。这时候我们可以采用以下方法: 1. 重写allocWithZone方法 我们可以重写类的allocWithZone方法,使其在实例化对象时抛出异常。在自定义类中加入下面的代码: + (instance…

    other 2023年6月27日
    00
  • Windows 11上手初体验:任务栏和开始菜单等迎来大改

    Windows 11上手初体验:任务栏和开始菜单等迎来大改 Windows 11是微软最新发布的操作系统,带来了许多令人兴奋的变化。其中,任务栏和开始菜单经历了大幅度的改进,为用户提供了更加现代化和个性化的体验。本攻略将详细介绍如何使用Windows 11的任务栏和开始菜单,并提供两个示例说明。 任务栏的改进 Windows 11的任务栏经过重新设计,变得更…

    other 2023年9月6日
    00
  • 漂亮实用的页面loading(加载)封装代码

    下面是详细的“漂亮实用的页面loading(加载)封装代码”的攻略。 什么是页面loading? 在访问网站页面的过程中,如果页面需要加载大量的内容,或者网络速度较慢,那么用户在等待页面加载的同时就会感到极为不耐烦。这时我们就需要一个页面loading来提示用户正在加载中,提高用户体验和满意度。 loading的封装代码实现 第一步:添加代码 我们需要在ht…

    other 2023年6月25日
    00
  • 如何获得ip地址?怎么查看ip地址?查看IP地址的方法

    如何获得IP地址? IP地址是用于在互联网上唯一标识设备的一组数字。获得IP地址的方法取决于您想要获取的IP地址类型:公共IP地址或私有IP地址。 获得公共IP地址 公共IP地址是由您的互联网服务提供商(ISP)分配给您的,用于在互联网上与其他设备进行通信。以下是获取公共IP地址的方法: 使用网页工具:访问一个提供公共IP地址查询的网页工具,例如WhatIs…

    other 2023年7月29日
    00
  • 详解JavaScript 的变量

    详解JavaScript的变量 JavaScript是一种动态类型的编程语言,变量在JavaScript中起着非常重要的作用。本攻略将详细讲解JavaScript的变量,包括变量的声明、赋值、作用域和数据类型等方面。 变量的声明和赋值 在JavaScript中,可以使用var、let和const关键字来声明变量。其中,var是ES5中引入的关键字,let和c…

    other 2023年8月9日
    00
  • MySQL如何修改字段类型和字段长度

    MySQL修改字段类型和字段长度的过程相对简单,下面我将为大家详细讲解完整攻略,包含两个示例说明。 步骤一:使用ALTER TABLE命令修改字段类型 使用ALTER TABLE命令可以修改已有表格的字段类型。下面是一些示例: 将字段类型从INT改为VARCHAR(50) ALTER TABLE customers MODIFY column_name VA…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部