2010-06-11 42 views
30

Có cách nào để chú thích một lớp bên trong vô danh trong Java không?Chú thích lớp bên trong vô danh

Trong ví dụ này, bạn có thể thêm chú thích cấp lớp vào Class2 không?

public void method1() { 
    add(new Class2() { 
    public void method3() {} 
    }); 
} 

Trả lời

32

No. Bạn cần phải quảng cáo nó đến lớp "phù hợp". Nó vẫn có thể được sắp xếp trong lớp bên ngoài nếu cần thiết, vì vậy nó không cần phải là một lớp cấp cao nhất, hoặc công khai, hay bất cứ thứ gì. Nhưng nó cần một định nghĩa lớp thích hợp để đính kèm chú thích.

+2

Lớp "thích hợp" thậm chí có thể được xác định trong phương pháp này, do đó phạm vi của nó là địa phương để các phương pháp và thiết kế tương tự, nó vẫn là một chi tiết thực hiện nội bộ của phương thức. – amichair

+0

Nếu bạn ngạc nhiên bởi mô tả của @ amichair về các lớp học địa phương (như tôi) lưu ý rằng nó là mới đối với JDK8 và các tài liệu ở đây: https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses. html –

+0

Rõ ràng các lớp địa phương đã có từ Java 1.1 ... nhưng chúng vẫn đáng ngạc nhiên :-) – amichair

10

Chưa. Tính năng này được đề xuất bởi JSR 308 và có thể được bao gồm trong các phiên bản Java trong tương lai.

+7

Bạn có thể muốn thêm "Không." nếu không câu trả lời của bạn gây ra một lỗi trang tinh thần. –

6

Có, as mentioned by yegor256, có thể, kể từ JDK 8 adopted JSR 308 (type annotations).

Vì vậy, bây giờ bất cứ khi nào một chú thích được trang trí bởi @Target({ElementType.TYPE_USE}), nó có thể được sử dụng để chú thích một lớp ẩn danh khi chạy. Ví dụ:

@Target({ ElementType.TYPE_USE }) 
@Retention(RetentionPolicy.RUNTIME) 
@interface MyAnnotation { 
    String value(); 
} 

Object o = new @MyAnnotation("Hello") Object() {}; 

Phần khó là làm thế nào để truy cập vào các chú thích:

Class<?> c = o.getClass(); 
    AnnotatedType type = c.getAnnotatedSuperclass(); 
    System.out.println(Arrays.toString(type.getAnnotations())); 
+0

Có tài liệu nào về cách truy cập các loại chú thích này không? Tôi không thể tìm thấy tài liệu chính thức mà tôi cần phải truy cập chúng với 'o.getClass(). GetAnnotatedSuperclass(). GetAnnotations()' có vẻ lạ và phản trực giác với tôi – Qw3ry

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