2011-08-29 26 views
6

xem xét mã này:Làm thế nào để có được giá trị của một đối số phương thức thông qua sự phản chiếu trong Java?

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

Tôi quan tâm đến giá trị của tham số chú thích với @Foo. Giả sử rằng tôi đã tìm ra thông qua sự phản chiếu (với Method#getParameterAnnotations()) tham số phương thức nào có chú thích @Foo. (Tôi biết nó là tham số thứ ba của danh sách tham số.)

Bây giờ tôi có thể lấy giá trị của bar để sử dụng thêm?

+3

Tôi không hiểu câu hỏi. Giá trị của 'bar' sẽ chỉ có sẵn trong thời gian chạy. Bạn có muốn chặn cuộc gọi đến 'example' không? Hoặc bạn có nghĩa là datatype 'Bar'? – home

Trả lời

11

Bạn không thể. Phản ánh không có quyền truy cập vào các biến cục bộ, bao gồm các tham số phương thức.

Nếu bạn muốn chức năng đó, bạn cần để đánh chặn các cuộc gọi phương pháp mà bạn có thể làm theo một trong những cách sau:

  • AOP (AspectJ/Spring AOP vv)
  • Proxy (JDK, CGLib vv)

Trong tất cả những điều này, bạn sẽ thu thập các tham số từ cuộc gọi phương thức và sau đó yêu cầu gọi phương thức để thực thi. Nhưng không có cách nào để lấy các tham số của phương thức thông qua sự phản chiếu.

Cập nhật: đây là một khía cạnh mẫu để giúp bạn bắt đầu sử dụng xác nhận chú thích dựa trên với 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

Tôi đã sử dụng AspectJ, nhưng tôi đã không tìm thấy cách để làm điều đó. Đây là câu hỏi trước đó: http://stackoverflow.com/questions/7228590/how-to-check-if-a-parameter-of-the-current-method-has-an-annotation-and-retrieve – soc

+0

@soc OK, xem bản cập nhật của tôi cho người mới bắt đầu, mua [AspectJ in Action] (http://www.manning.com/laddad2/) để thực sự tìm hiểu cách thực hiện (hoặc đặt câu hỏi trên [danh sách người dùng AspectJ] (http://www.eclipse.org/aspectj/userlists.php) –

+0

Xin cảm ơn! :-) Tôi đã mua cuốn sách, nhưng tôi đã cố gắng để đưa mọi thứ vào chữ ký khớp, không hoạt động ... – soc

Các vấn đề liên quan