2012-11-10 36 views
11

Tôi đã tạo chú thích của riêng mình, mà tôi sử dụng qua phản ánh để đưa ra quyết định trong mã của mình. Chú thích có giá trị mặc định được đặt cho phần tử duy nhất của nó. Có cách nào tôi có thể truy cập các giá trị mặc định thông qua sự phản ánh?Nhận giá trị phần tử mặc định từ chú thích trong Java

PageableRequestMapping.java (Annotation)

package org.tothought.controllers.annotations; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface PageableRequestMapping { 
    String variablePath() default "/"; 
} 

psuedo Mã để lấy giá trị mặc định

private int parsePageNumber(StringBuffer requestURL, 
     PageableRequestMapping pageableRequestMapping) { 

     String variablePath = pageableRequestMapping.variablePath(); 

    //Psuedo code doesn't work in Java, included to illustrate intentions 
     if(variablePath.equalsIgnoreCase(pageableRequestMapping.variablePath().default())){ 
      //handle default case  
     }else{ 
      //handle different case 
     } 
     return 0; 
} 

nghiên cứu của tôi về vấn đề này đã bật lên không có ví dụ. Tôi giả định giá trị này có thể được truy cập một cách tĩnh thông qua lớp, nhưng nó không thể. Vì vậy, tôi còn lại với hai câu hỏi.

  • Có thể nhận giá trị mặc định của phần tử trong chú thích không?
  • Nếu có, làm cách nào?

Ngoài ra, tôi biết tôi có thể mã hóa cứng giá trị này, tuy nhiên tôi muốn làm cho chương trình hơi mạnh mẽ hơn.

Trả lời

13

Bạn có thể sử dụng phản ánh để có được những đối tượng Method, và sau đó sử dụng Method#getDefaultValue().

Method method = pageableReqMapping.annotationType().getMethod("variablePath"); 
String variablePath = (String) method.getDefaultValue(); 

Dưới đây là một ví dụ cụ thể:

public class AnnotationTest { 

    public static void main(String[] args) throws Exception { 
    Class<?> clazz = Annotation.class; 
    Method method = clazz.getDeclaredMethod("value"); 
    String value = (String) method.getDefaultValue(); 
    System.out.println(value); 
    } 

    public @interface Annotation { 
    String value() default "default value"; 
    } 
} 
+0

Giải pháp trả về null; Tôi đang kiểm tra để chắc chắn rằng nó không phải là tôi. Mã này bạn có chạy không? –

+0

Tôi đã viết một chương trình thử nghiệm, chạy thành công: http://pastie.org/5356931 – Vulcan

+1

Tôi chỉ tìm ra và dán của bạn đã xác nhận lại nó. Bạn cần phải có lớp theo cách tĩnh. Thay vì 'pageableRequestMapping.getClass', bạn cần sử dụng' PageableRequestMapping.class'. Tôi tự hỏi tại sao việc nhận lớp từ cá thể khác với truy cập tĩnh vào lớp. Cảm ơn câu trả lời tuyệt vời, tôi đánh giá cao nó. –

1

Bạn có thể làm theo cách này, bằng cách áp dụng chú thích của mình trên một lớp và lấy nó ra khỏi lớp thông qua phản ánh:

@PageableRequestMapping 
class MyUtilClass{ 
} 


public String getDefaultValue(){ 
    PageableRequestMapping pageableRequestMapping = MyUtilClass.class.getAnnotation(PageableRequestMapping.class); 
    return pageableRequestMapping.variablePath(); 
} 
+0

OP được hỏi làm thế nào để lấy giá trị mặc định của chú thích, đó là '/', không 'test'. – Vulcan

+0

Tôi biết, đây là một cách tiếp cận đó là tất cả những gì tôi đang nói, và nó hoạt động như vậy là hoàn toàn không cần phải đánh dấu nó xuống. –

+0

Tôi đã bỏ phiếu xuống vì nó không hoạt động chính xác, trước khi bạn chỉnh sửa. Mặc dù điều này hoạt động ngay bây giờ, nó không quá mạnh mẽ. OP đã đề cập rằng anh ta có thể lưu trữ giá trị trong một hằng số (như 'MAPPING_DEFAULT') và chỉ cần truy cập vào giá trị đó. Giải pháp của bạn đòi hỏi sự lộn xộn không mong muốn hơn là một hằng số. – Vulcan

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