2011-08-29 28 views
6

Bu kodu dikkate alın:Java'da yansıtma yöntemi ile bir yöntem argümanı değeri nasıl alınır?

public void example(String s, int i, @Foo Bar bar) { 
    /* ... */ 
} 

@Foo ile açıklanmış olan argümanın değeriyle ilgileniyorum. Metot parametresinin @Foo açıklamasına sahip olduğu (Method#getParameterAnnotations() ile) yansıması ile daha önce anladığımı varsayalım. (Parametre listesinin üçüncü parametresi olduğunu biliyorum.) Xzx19

Şimdi daha fazla kullanım için bar değerini nasıl alabilirim?

+3

ile ek açıklama tabanlı doğrulama kullanmaya başlamasını sağlamak için örnek bir yönü var. 'Bar 'değeri sadece çalışma zamanında kullanılabilir. 'Example' için çağrıları engellemek istiyor musunuz? Yoksa "Bar" veri türünü mi kastediyorsunuz? – home

cevap

11

Yapamazsınız. Yansıma, yöntem parametreleri de dahil olmak üzere yerel değişkenlere erişemez. ,

  • AOP (AspectJ/Spring AOP vs.)
  • Proxies (JDK: Eğer bu işlevselliği isterseniz

    , size birkaç yoldan biriyle yapabilir yöntem çağrısı, yolunu kesmek gerekir CGLib vd)

Tüm bunlarda, parametreleri yöntem çağrısından toplar ve ardından yöntem çağrısını yürütmesini söylersiniz. Ancak, yansıma yoluyla yöntem parametrelerine ulaşmanın bir yolu yoktur.

Güncelleme: burada ben soru alamadım AspectJ

public aspect ValidationAspect { 

    pointcut serviceMethodCall() : execution(public * com.yourcompany.**.*(..)); 

    Object around(final Object[] args) : serviceMethodCall() && args(args){ 
     Signature signature = thisJoinPointStaticPart.getSignature(); 
     if(signature instanceof MethodSignature){ 
      MethodSignature ms = (MethodSignature) signature; 
      Method method = ms.getMethod(); 
      Annotation[][] parameterAnnotations = 
       method.getParameterAnnotations(); 
      String[] parameterNames = ms.getParameterNames(); 
      for(int i = 0; i < parameterAnnotations.length; i++){ 
       Annotation[] annotations = parameterAnnotations[i]; 
       validateParameter(parameterNames[i], args[i],annotations); 
      } 
     } 
     return proceed(args); 
    } 

    private void validateParameter(String paramName, Object object, 
     Annotation[] annotations){ 

     // validate object against the annotations 
     // throw a RuntimeException if validation fails 
    } 

} 
+0

Zaten AspectJ kullanıyorum ama bunu yapmanın bir yolunu bulamadım. Bu daha önceki soru: http://stackoverflow.com/questions/7228590/how-to-check-if-a-parameter-of-the-current-method-has-an-annotation-and-retrieve – soc

+0

@soc Tamam, yeni başlayanlar için güncellememi görün, nasıl yapılacağını öğrenmek için [AspectJ in Action] (http://www.manning.com/laddad2/) (http://www.manning.com/laddad2/) satın alın (veya [AspectJ kullanıcıları listesi] ile ilgili sorular sorun (http://www.eclipse.org/aspectj/userlists.php) –

+0

Hey teşekkürler! :-) Kitabı zaten satın aldım, ama her şeyi maç imzalarına sokmaya çalıştım, işe yaramadı ... – soc

İlgili konular