这是一个包含Java反射的新任务。 假设我有2个classe:
public class A{
bool foo(){...}
}
public class B extends A{
bool foo(){...}
}
假设我有一个接收Class<?>
参数的函数,我想检查某些派生类中是否覆盖了foo
,而不知道是否有,我该怎么做?
我读了一些关于同一主题的任务,提到了isBridge或getDeclaringclass,但无法弄清楚那些是什么。
我必须提到我并不了解Java。这是我所采用的面向对象编程课程的一部分,所以它并不是要让我们成为Java专家,而是要展示这些原理。这意味着我的问题的解决方案不应该太复杂。
答案 0 :(得分:1)
假设:
class A
{
public void foo()
{
System.out.println("Ok on A");
}
}
class B extends A
{
public void foo()
{
System.out.println("Ok on B");
}
}
您可以遍历搜索方法
的类的层次结构树String methodName="foo";
Class currentClass=B.class.getSuperclass();
boolean overwritten=false;
while(currentClass!=Object.class && !overwritten)
{
try
{
Method m=currentClass.getMethod(methodName);
overwritten=true;
break;
}
catch (NoSuchMethodException e) {
// Method does not exists
} catch (SecurityException e) {
// Security exception
}
currentClass=currentClass.getSuperclass();
}
如果覆盖为真,我们在某个父类中找到了该方法。
注意我们正在检查没有参数的方法(foo),要查找带参数的方法,你必须在getMethod调用中将它们指定为第二个参数。
现在,如果你想找到&#34;任何类&#34;已覆盖foo方法,您必须扫描类路径中的所有类,搜索它们是否包含目标方法,并为每个类执行相同的测试,或使用像org.reflections这样的反射库,您可以找到更多以下帖子中关于子类查找的信息:how-do-you-find-all-subclasses-of-a-given-class-in-java