![](/img/trans.png)
[英]How to get the java Class to which a method belongs given the method signature?
[英]Catching called method belongs to which class
我的查询是假设我们有几个类,假设三个类是这样的:
查看我更新的查询。 他们要求的就是这种情况。
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()
方法。 注意,这个问题不是出于调试目的-这是理论上的。
好吧,实际上可能有一种方法可以做到这一点(还没有尝试过):
获取所使用实例的类。 执行getDeclaredMethod获取方法。 在方法上执行getDeclaringClass。
尝试这个。
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);
}
}
}
您将从MethodContainerC
调用display()
,从而Display from MethodContainerC
打印输出Display from MethodContainerC
。
这是重写的工作方式:如果要调用超类的方法,则需要从重写的方法内部显式调用super
。 否则,您将调用重写的方法。
但是,如果MethodContainerC
没有方法display()
,则将调用MethodContainerB
的display方法。 这是因为继承遵循最接近的路径:
MethodContianerA
具有方法display()
... MethodContainerB
覆盖... MethodContianerC
覆盖。) 如果切出最后一步,则MethodContainerB
仍将覆盖所有MethodContainerC
display()
。 该方法的最接近的实现将始终运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.