Java 捕获被调用的方法属于哪个类

Java 捕获被调用的方法属于哪个类,java,overriding,Java,Overriding,我的问题是假设我们有很多类假设有三个类,如下所示: 查看我更新的查询。这就是他们要求的情况。 class MethodContainerA { public void display() { System.out.println("Display from MethodContainerA"); } } class MethodContainerB extends MethodContainerA { public void display() {

我的问题是假设我们有很多类假设有三个类,如下所示:

查看我更新的查询。这就是他们要求的情况。

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()
方法的信息。注意,此问题不是为了调试目的-它是理论性的。

您将从
MethodContainerC
调用
display()
,从而从MethodContainerC打印出
display

这就是重写的工作方式:如果你想调用超类的方法,你需要在被重写的方法中显式地调用
super
。否则,您将调用重写的方法

但是,如果在
MethodContainerC
中没有方法
display()
,则将调用
MethodContainerB
的显示方法。这是因为继承遵循最近的路径:

  • MethodContianerA
    有一个方法
    display()
  • 它被
    MethodContainerB
    覆盖
  • (由
    MethodContianerC
    覆盖)

如果删除最后一步,
MethodContainerB
仍然覆盖所有
MethodContainerC
display()。方法的最接近的实现将始终运行。

您将从
MethodContainerC
调用
display()
,并将从MethodContainerC打印出
display

这就是重写的工作方式:如果你想调用超类的方法,你需要在被重写的方法中显式地调用
super
。否则,您将调用重写的方法

但是,如果在
MethodContainerC
中没有方法
display()
,则将调用
MethodContainerB
的显示方法。这是因为继承遵循最近的路径:

  • MethodContianerA
    有一个方法
    display()
  • 它被
    MethodContainerB
    覆盖
  • (由
    MethodContianerC
    覆盖)
如果删除最后一步,
MethodContainerB
仍然覆盖所有
MethodContainerC
display()。将始终运行该方法最接近的实现。

尝试此操作

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);
       }
      }
    }
试试这个

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);
       }
      }
    }

嗯,实际上可能有一种方法可以做到这一点(我没有尝试过):


获取所用实例的类。执行getDeclaredMethod以获取方法。对该方法执行getDeclaringClass。

实际上,可能有一种方法可以做到这一点(尚未尝试):



获取所用实例的类。执行getDeclaredMethod以获取方法。对方法进行getDeclaringClass。

为什么需要知道?这本身就是一种设计的味道。嗯,你把信息打印到你的控制台上,还是我误解了什么?你会如何处理这些信息?那么你是说在MethodContainerC.display中,你想让它知道它是从methodcallrecognition调用的吗?还是什么?在电话和回音之后?不。@MrD许多问题都是理论性的。这个正好有点基本。我们能接受这个事实,继续前进吗?如果你不喜欢这个问题,就否决它,你为什么需要知道?这本身就是一种设计的味道。嗯,你把信息打印到你的控制台上,还是我误解了什么?你会如何处理这些信息?那么你是说在MethodContainerC.display中,你想让它知道它是从methodcallrecognition调用的吗?还是什么?在电话和回音之后?不。@MrD许多问题都是理论性的。这个正好有点基本。我们能接受这个事实,继续前进吗?如果你不喜欢这个问题,否决票it@ifdisplay不是用MethodContainerC写的。@Nikhil-如果MethodContainerC中没有
display
方法,那么将调用
display
的最近超类实现。然后您将调用它最近的超类的方法,并从中打印
displayMethodContainerB
@GnomezGrave我想知道哪一个是最近的类。@如果display不是用MethodContainerC编写的,那么。@Nikhil-如果MethodContainerC中没有
display
方法,那么将调用
display
的最近超类实现。然后您将调用它最近的超类的方法,它将从MethodContainerB打印
显示
@GnomezGrave,即我想知道哪一个是最近的类。在您的答案之前,已经用代码给出了答案:)。@Hot clicks这就是人们开始向下投票的原因。我正在解释这种情况。@Nikhil-Do注意,这种技巧与你是否“刚刚打过电话”无关方法与否——你只需要实例指针,整个应用程序中的任何地方都不需要调用该指针。在你的答案之前,你已经用代码给出了答案:)。@Hot Licks这就是人们开始向下投票的原因。我正在解释这种情况。@Nikhil-Do注意,这种技术与您是否“刚刚调用”该方法无关——您只需要实例指针,而不需要在整个应用程序的任何地方调用该指针。您可以(假设)使用getDeclaredMethod按名称只获取一个方法对象。(这是一个有点混乱的设置