我的查询假设我们有多个类,假设有三个类是这样的:
查看我的更新查询。这是他们要求的情况。
class MethodContainerA {
public void display() {
System.out.println("Display from MethodContainerA");
}
}
class MethodContainerB extends MethodContainerA {
public void display() {
System.out.println("Display from MethodContainerB");
}
}
class MethodContainerC extends MethodContainerB {
}
public class MethodCallRecognization {
public static void main(String[] args) {
MethodContainerC methodContainerC = new MethodContainerC();
methodContainerC.display();
// I want to know here
}
}
我的问题是,在调用之后我可以从哪个类中获取信息display()
方法。注意,这个问题不是出于调试目的 - 它是理论上的。
答案 0 :(得分:3)
嗯,实际上可能有办法做到这一点(没试过):
获取所用实例的类。 getDeclaredMethod来获取Method。在方法上做getDeclaringClass。
答案 1 :(得分:2)
试试这个。
public class MethodCallRecognization {
public static void main(String[] args) {
MethodContainerC methodContainerC = new MethodContainerC();
methodContainerC.display();
// I want to know here
String className=getClassName(methodContainerC.getClass(), "display") ;
System.out.println(className);
}
public static String getClassName(Class c,String methodName){
Method m[]=c.getDeclaredMethods();
for(Method m1:m){
if(m1.getName().equals(methodName)){
return c.getName();
}
}
return getClassName(c.getSuperclass(),methodName);
}
}
如果方法过载,您还需要检查参数类型而不是名称。但这应该会让你有所了解。
根据评论,这里是getClassName
public static String getClassname(Class c, String methodName){
try{
Method m= c.getDeclaredMethod( methodName);
return c.getName();
}catch(NoSuchMethodException nse){
return getClassName(c.getSuperclass(),methodName);
}
}
如果dsiplay方法正在接受参数
public class MethodCallRecognization {
public static void main(String[] args) {
MethodContainerC methodContainerC = new MethodContainerC();
methodContainerC.display("" , "");//Suppose it takes String id and String name parameter
// I want to know here
Class[] parametertype={String.class,String.class};
String className=getClassName(methodContainerC.getClass(), "display", parametertype) ;
System.out.println(className);
}
public static String getClassname(Class c, String methodName, Class[] parametertype){
try{
Method m= c.getDeclaredMethod( methodName, parametertype);
return c.getName();
}catch(NoSuchMethodException nse){
return getClassName(c.getSuperclass(),methodName, parametertype);
}
}
}
答案 2 :(得分:1)
您将从display()
致电MethodContainerC
,然后打印Display from MethodContainerC
。
这是重写的方式:如果要调用超类的方法,则需要在重写方法中显式调用super
。否则,您将调用重写的方法。
但是,如果display()
中没有方法MethodContainerC
,则会调用MethodContainerB
的显示方法。这是因为继承遵循最近的路径:
MethodContianerA
有一个方法display()
... MethodContainerB
... MethodContianerC
覆盖。)如果您删除了最后一步,MethodContainerB
仍会覆盖所有display()
的{{1}}。将始终运行最接近的方法实现。