2011-01-17 8 views
5

Bu sefer, ek açıklamadan atılan istisnayı almak istiyorum. Benim örnek kod şu şekildedir:Java'da istisna yöntemini alarak ek açıklama nasıl alınır?

public class P { 

    @MyAnnotation(stringValue = "FirstType", intValue = 999) 
    public void test() throws Exception { 
     // ... 
     throw new NullPointerException(); 
    } 

    @MyAnnotation(stringValue = "SecondType", intValue = 111) 
    public void test(int a) throws Exception { 
     // ... 
     throw new NullPointerException(); 
    } 
} 

yukarıdaki sınıf 2 yöntemlerini içerir ve her ikisi de NullPointerException atmak.

Artık istisnayı geri almak ve paketin adını, sınıf adını ve istisna neden olan satır numarasını öğrenmek için callerElement öğesini kullanabilirim. İşte benim kodudur: Benim konsol penceresinde

public class CallP { 
    public static void main(String[] argv){ 
     P class_p = new P(); 

     StackTraceElement[] callerElement = null; 
     try{ 
      class_p.test(); 
     }catch(Exception e){ 
      callerElement = e.getStackTrace(); 
      System.out.println(callerElement[0].toString()); 
     } 
    } 
} 

, iletiyi

StackoverflowQuestion.P.test (P.java:9)

Sorularım olduklarını görebilirsiniz 1. Ekleme deyiminde ek açıklama nasıl alınır? 2. Metod aşırı yüklendiğinde (P sınıfında, test denen iki yönteme sahibim), ek açıklama nasıl alınır?

Bu benim bütün sorularım. Okuma için zaman ayırdığınız için teşekkürler.

cevap

3

Sınıf ve yöntem adını almak için getClassName ve getMethodName() adreslerini kullanabilir ve ardından ek açıklama almak için yansımayı kullanabilirsiniz.

ipucu:Class.forName(...) sonra, klass.getMethod(...) veya getDeclaredMethod(...) ya da başka bir varyantı, daha sonra method.getAnnotations() veya başka bir türevi. IMO, getMethod(String name, Class<?>... parameterTypes) ihtiyaçlarınızı karşılar, istenilen yöntemi elde etmek için parameterType öğesini geçirebilirsiniz.

Not: Bunu bulabilmenin bir yolu yoktur. Tek fark, satır numarasıdır. Ve şüpheliyim ki, istediğimiz yöntemi ve ek açıklamalarını almak için bunu kullanabilirsek. Dolayısıyla, aklıma gelen tek çözüm, bu durumda aşırı yüklenmeyi önlemek ve test yöntemlerini benzersiz olarak adlandırmaktır. Tabii ki, etrafta bir iş olurdu, ama ismin orada neyin test edileceğini söyleyecek kadar açıklayıcı olduğunu düşünmüyor musunuz?

+1

Merhaba, Adeel Ansari. Yöntem adını almak için callerElement [0] .getMethodName() öğesini kullanabilirim. Ancak, hangisini almak istediğimi (iki tane "test()") biliyorum. –

+0

@Charles: Evet haklısınız. Bunu öğrenmenin bir yolu yok. Tek fark, satır numarasıdır. Ve şüpheliyim ki, istediğimiz yöntemi ve ek açıklamalarını almak için bunu kullanabilirsek. –