获取表示异常起源的Method对象



在Java中,是否有可能获得一个方法对象,该对象表示抛出异常的方法,只提供所说的异常?

给定示例:

public class Test {
    protected void toFail() throws Exception {
        throw new Exception();
    }
    protected void toFail(String someparameter) throws Exception {
        throw new Exception();
    }
    public static void main(String[] args) {
        try {
            new Test().toFail("");
        }catch(Exception ex){
            //Clever code here
        }
    }
}

什么聪明的代码将允许我得到一个方法对象表示toFail(String)方法?假设这是可能的:)

澄清:我需要唯一地标识引起异常的方法,并且我需要能够从中创建一个反射方法对象。当我说唯一时,我的意思是我需要考虑到重载方法的可能性。

您可以像这样获得抛出它的类和方法的名称:

StackTraceElement ste = exception.getStackTrace()[0];
String className = ste.getClassName();
String methodName = ste.getMethodName();

但是您无法获得Method对象,因为StackTraceElement没有记录具有相同名称的方法的

您可以像这样获得possible Method对象(possible匹配名称):

StackTraceElement ste = exception.getStackTrace()[0];
Class<?> c = Class.forName(ste.getClassName());
String mname = ste.getMethodName();
// NOTE:
// Exceptions thrown in constructors have a method name of "<init>"
// Exceptions thrown in static initialization blocks have a method name of
//    "<cinit>"
if ("<init>".equals(mname)) {
    // Constructors are the possible "methods", all of these:
    c.getConstructors();
} else if ("<cinit>".equals(mname)) {
    System.out.println("Thrown in a static initialization block!");
} else {
    // Thrown from a method:
    for (Method m : c.getMethods()) {
        if (m.getName().equals(mname)) {
            System.out.println("Possible method: " + m);
        }
    }
}

使用StackTrace()

public class Test {
    protected void toFail(String someparameter) throws Exception {
        throw new Exception();
    }
    public static void main(String[] args) {
        try {
            new Test().toFail("");
        }catch(Exception ex){
            StackTraceElement[] stl = ex.getStackTrace();
            System.out.println(stl[0].getMethodName());
       }
    }
}

相关内容

  • 没有找到相关文章

最新更新