2011-11-25 32 views
8

Có cách nào để ghi đè lên một phương thức tại thời gian chạy không? ngay cả khi nó yêu cầu tạo động một lớp con từ cá thể đó?là nó có thể ghi đè lên một phương pháp trong thời gian chạy?

+1

Tại sao? Bạn đang cố làm gì vậy? – SLaks

+0

@Maxwell lý do của bạn cho việc muốn làm điều này là gì? Bạn chỉ có thể xác định chi tiết phương pháp tại thời gian chạy? –

Trả lời

7

Với Java thuần túy, không.

Với asm hoặc cglib hoặc aspectj, có.

Trong Java đơn giản, điều cần làm trong một tình huống như thế là tạo một interface-based proxy xử lý lời gọi phương thức và ủy quyền cho đối tượng gốc (hoặc không).

2

Bạn có thể tạo một anonymous class đó sẽ ghi đè phương pháp và sử dụng strategy pattern quyết định phải làm gì.

Nếu bạn đang tìm kiếm tổng hợp động từ mã, bạn có thể làm theo these instructions

+0

Btw, tôi đã sử dụng trình biên dịch động để triển khai khung kiểm thử theo kịch bản .NET. Tôi đọc một kịch bản C# và soạn một lớp: "public class Test {public void Method() {" + userScript + "}}". Sau đó, tôi chỉ cần xây dựng toàn bộ điều và được gọi là "Test.Method" bằng cách sử dụng phản ánh giống như trong liên kết tôi đã gửi. –

0

Như những người khác nói, không, bạn không thể ghi đè lên một phương pháp khi chạy. Tuy nhiên, bắt đầu với Java 8 bạn có thể sử dụng phương pháp chức năng. Function là giao diện chức năng cho phép bạn xử lý các chức năng dưới dạng loại tham chiếu. Điều này có nghĩa là bạn có thể tạo một vài cái và chuyển đổi giữa chúng (động) một mẫu chiến lược a la.

Hãy xem xét một ví dụ:

public class Example { 

    Function<Integer, Integer> calculateFuntion; 

    public Example() { 

     calculateFuntion = input -> input + 1; 
     System.out.println(calculate(10)); 
     // all sorts of things happen 
     calculateFuntion = input -> input - 1; 
     System.out.println(calculate(10)); 
    } 

    public int calculate(int input) { 
     return calculateFuntion.apply(input); 
    } 

    public static void main(String[] args) { 
     new Example(); 
    } 
} 

Output:

Tôi không biết trong hoàn cảnh nào và thiết kế bạn có ý định để ghi đè lên, nhưng quan điểm là bạn thay thế hành vi của phương pháp, đó là những gì ghi đè.

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