Ai đó có thể chỉ cho tôi phần đặc tả giải quyết vấn đề này không?
này chủ yếu sẽ được xác định trong phần liên quan đến Method invocation expressions:
Bước đầu tiên trong việc xử lý một invocation phương pháp tại thời gian biên dịch là con số ra tên của phương pháp này được gọi và đó lớp hoặc giao diện để tìm kiếm các định nghĩa về các phương thức của tên đó.
Đối với lớp hoặc giao diện để tìm kiếm, có sáu trường hợp để xem xét, tùy thuộc vào hình thức mà trước ngoặc trái của MethodInvocation:
- [...]
- Nếu biểu mẫu là
Primary . [TypeArguments] Identifier
, sau đó để T
là loại biểu thức Chính. Lớp hoặc giao diện để tìm kiếm là T
nếu T
là loại hoặc loại giao diện hoặc giới hạn trên của T
nếu T
là biến kiểu.
Ở đây, biểu tiểu là class instance creation expression. Vì vậy, loại tìm kiếm là loại ẩn danh.
Tôi có nghĩ rằng cách duy nhất bạn có thể gọi xin chào là ngay lập tức như thế này. Điều gì về sự phản ánh?
Chừng nào một biểu thức đánh giá vào loại vô danh T
, dù là thông qua truy cập trực tiếp như bạn có, hoặc thông qua Generics, bạn có thể truy cập (access rules thường xuyên áp dụng) cho các thành viên rằng T
tuyên bố. Điều này không giới hạn trong các phương thức. Bạn có thể truy cập các trường hoặc loại, mặc dù nó không hữu ích cho các loại. Ví dụ,
Object var = new Object() {
class Nested {
}
}.new Nested();
Kể từ khi không có cách nào để tham khảo các loại lồng nhau mà không loại kèm theo, bạn có thể không khai báo một biến kiểu lồng nhau. Tính hữu dụng giảm rất nhanh. (Có lẽ, đó cũng là lý do tại sao bạn không thể có một loại lồng nhau static
trong lớp ẩn danh này.)
Phản ánh cũng cho thấy phương pháp này. Lớp ẩn danh được tạo ra chứa phương thức này, vì vậy bạn có thể lấy nó và gọi nó. Quá trình này như nhau. Thực tế là trường hợp là từ một lớp vô danh không quan trọng. Chiến lược tương tự như được trình bày trong How do I invoke a Java method when given the method name as a string? được áp dụng.
Ví dụ,
Object ref = new Object() {
public void method() {
System.out.println("hidden");
}
};
Class<?> anonymousClass = ref.getClass();
Method method = anonymousClass.getMethod("method");
method.invoke(ref, new Object[0]);
Đừng bao giờ viết mã như thế này.
[JLS-15.9.5. Tuyên bố lớp ẩn danh] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5) –
Bạn sẽ có thể truy cập thông qua phản ánh. Nhưng có, điều này gần như hoàn toàn vô nghĩa.Nếu bạn muốn gọi các phương thức, bạn thường thực hiện một Giao diện trong lớp ẩn danh của bạn. – Thilo
Vâng, nếu bạn tạo một lớp ẩn danh của một loại cụ thể hơn (như, việc triển khai ẩn danh * giao diện *), bạn có thể giữ tham chiếu trong biến để cho phép bạn gọi những phương thức đó theo ý muốn. –