要判断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
类中,我们实例化了 SubClass
和 SuperClass
的对象,并使用 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
类中,我们实例化了 SubClass
和 SuperClass
的对象,并使用 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技术站