2013-06-21 43 views
9

Tôi muốn tạo chú thích của riêng mình để chú thích một số biến cục bộ. Để viết chú thích không phải là vấn đề, vấn đề là lấy thông tin của chúng tại Runtime. Tôi chỉ có thể nhận được một số thông tin từ các phương thức chú thích hoặc các tham số của phương thức, chứ không phải từ các biến cục bộ. Có cách nào để lấy nó không?Loại chú thích ElementType.LOCAL_VARIABLE

chú thích riêng của tôi là một cái gì đó như thế:

public void m(int a) 
@MyOwnAnnotation(some information) 
int b = 5; 
} 

Hoặc, như một sự thay thế, có cách nào để lấy mã của phương pháp này, để phân tích nó hơn nữa và cuối cùng nhận được giá trị chú thích?

Xin cảm ơn trước.

+0

liên kết của bạn trong một nhận xét khác cung cấp cho bạn câu trả lời: nó không được định dạng tệp lớp hỗ trợ. Tôi có thể đưa ra một câu trả lời với các liên kết đến đặc tả JVM và giải thích nếu bạn muốn, nhưng tôi nghĩ rằng câu hỏi khác khá nhiều bao gồm nó. Tôi ngạc nhiên rằng 'apt' không cung cấp cho bạn những gì bạn cần. – parsifal

Trả lời

15

Với sự phản ánh bạn không thể truy lục biến cục bộ. Vì vậy, bạn không thể lấy một chú thích trên một biến cục bộ thông qua sự phản chiếu. Tôi nghĩ rằng loại chú thích này chỉ được sử dụng cho các cảnh báo trình biên dịch.

Bạn có thể ghé http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html

chú thích biến địa phương không được giữ lại trong các tập tin lớp (hoặc trong thời gian chạy) không phụ thuộc vào chính sách duy trì thiết lập trên các loại chú thích. Xem JLS 9.6.1.2.

Nếu bạn không thể truy xuất mã phương thức, bạn có thể sử dụng JavaParser (http://javaparser.org/).

2

JLS 9.6.1.2 thực sự tuyên bố rằng chú thích biến cục bộ không được giữ lại. Tuy nhiên, JSR 308 đang hoạt động theo cách của mình thông qua quy trình cộng đồng. Nó sẽ cung cấp cho bạn khả năng bạn cần.

Nếu bạn muốn có giải pháp tạm thời, here is an implementation of JSR 308.

8

Kể từ Java 8, chú thích biến cục bộ được giữ lại trong tệp lớp. Theo ghi nhận của Erick Hagstrom, lỗi lâu đời này đã được sửa bởi JSR 308, cũng đã thêm các chú thích kiểu vào ngôn ngữ Java.

Tuy nhiên, API phản chiếu của Java chưa được cập nhật để cấp quyền truy cập trong các cơ quan phương thức. Bạn sẽ cần phải phân tích cú pháp của classfile. Bạn có thể sử dụng công cụ như ASM. Tôi không khuyên dùng JavaParser, bởi vì nó chưa được cập nhật ngoài Java 1.5.

+0

[JLS 9.6.4.2. @Retention] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.2) nói điều gì đó khác: _ "[...] trình biên dịch Java phải đảm bảo rằng 'a' được biểu diễn trong biểu diễn nhị phân của lớp hoặc giao diện trong đó' a' xuất hiện, trừ khi 'm' chú thích khai báo biến cục bộ. Chú thích trên khai báo biến cục bộ không bao giờ được giữ lại trong biểu diễn nhị phân." _ –

-3

Hiện tại, như đã đề cập trong một số bài đăng khác, bạn không thể truy lục giá trị biến cục bộ chỉ đơn giản từ chú thích.

Tuy nhiên, tôi đã gặp phải vấn đề về simimlar và được quản lý để đưa ra giải pháp sử dụng các trường.Mẫu mã là dưới đây:

Interface Lớp

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface test{ 
} 

POJO

public class testObject{ 
    @test 
    private String one; 
    private String two; 

    //Getters and Setters 
} 

Nhận Object đánh giá cao

public void getFields (Object obj){ 
    Field fields = obj.getClass().getDeclaredFields(); 

    for (Field f : fields){ 
     test fieldAnnotation = f.getAnnotation(test.Class); 
     if (fieldAnnotation != null){ 
      f.get(obj); 
      // Do things here based on the values 
     } 
    } 
} 

Main Lớp

public static void main(String[] args){ 
    //Create object 
    testObject test = new testObject(); 

    test.setOne("testOne"); 
    test.setTwo("testTwo"); 
    getFields(test); 
} 

Hy vọng rằng điều này giúp trong việc giải thích làm thế nào bạn có thể nhận được các trường cho một đối tượng dựa trên các chú thích. Bạn chỉ cần sử dụng chú thích để 'đánh dấu' các trường bạn muốn truy xuất và sau đó đọc giá trị từ đối tượng.