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