これは低レベルのプロセスである必要があります。現在のレベルでは同じことをすることはできませんが、コードが必要でシステムが複雑になることがあります。 しかし私の提案はこのようなものです(私はそれが正しいことを望みます)、まず例外を処理したい人のためのインターフェースを定義します。
interface ExceptionHandler{
void handleException(Throwable t);
}
ユーザー(API)がそのメソッドをマークする注釈を指定すると、例外がスローされることがあります。
次に、このような例外をスローする可能性があるメソッドを呼び出すためのインターフェイスが必要です。
interface Caller{
void callMethod()throws Throwable;
}
、あなたが世話をし、実行の流れを管理し、可能な例外ハンドラを呼び出す
class MethodCaller{
/*
* @param isntance: instance which implemented the Caller interface
*/
public static void callMethod(Caller instance)
throws Exception {
Method m = instance.getClass().getMethod("callMethod");
Annotation as[] = m.getAnnotations();
Catch[] li = null;
for (Annotation a : as) {
if (a.annotationType().equals(CatchGroup.class)) {
li = ((CatchGroup) a).catchers();
}
// for(Catch cx:li){cx.targetException().getName();}
}
try {
instance.callMethod();
} catch (Throwable e) {
Class<?> ec = e.getClass();
if (li == null) {
return;
}
for (Catch cx : li) {
if (cx.targetException().equals(ec)) {
ExceptionHandler h = cx.targetCatchHandler().newInstance();
h.handleException(e);
break;
}
}
}
}
}
を、最終的には、いくつかの例を持っていることができます、それは私のために非常によく働く男を必要とし、かっこいいね。 例外ハンドラ。
public class Bar implements ExceptionHandler{//the class who handles the exception
@Override
public void handleException(Throwable t) {
System.out.println("Ta Ta");
System.out.println(t.getMessage());
}
}
とメソッド呼び出し側。
class Foo implements Caller{//the class who calls the method
@Override
@CatchGroup(catchers={
@Catch(targetCatchHandler=Bar.class,targetException=ArithmeticException.class),
@Catch(targetCatchHandler=Bar.class,targetException=NullPointerException.class)})
public void callMethod()throws Throwable {
int a=0,b=10;
System.out.println(b/a);
}
public static void main(String[] args) throws Exception {
Foo foo=new Foo();
MethodCaller.callMethod(foo);
}
}
ご覧のように、ユーザーがcallmethod()
方法でメソッドを呼び出す必要があり、あなたもCaller
インタフェースを省略し、そしてそれは余分の束を必要とすることをクラスで複数のメソッドを宣言するために、アノテーションを使用しますコード。 私はいくつかの手を差し伸べることができれば幸いです。
注釈は単独で動作を追加しません。それらはメタデータです。その動作を検出するとその動作を追加できるパーサを提供する必要があります。 –
私はそれをマイナーなmuckeryと呼ぶだろう。 AOPやいくつかのバイトコード操作で簡単に処理できます。 –