2011-11-24 40 views
5

Có thể ghi đè lên một phương pháp cho một thể hiện của một lớp không?ghi đè lên một phương thức cho một thể hiện của một lớp?

Điều kiện tiên quyết: Trò chơi có phương pháp ghi đè có thể act().

public class Foo { 

    public Method[] getMethods() { 
    Class s = Game.class; 
    return s.getMethods(); 
    } 

    public void override() 
    { 
    Method[] arr = getMethods() 
    for (int i = 0; i<arr.length; i++) 
    { 
     if (arr[i].toGenericString().contains("act()") 
     { 
     // code to override method (it can just disable to method for all i care) 
     } 
    } 
    }     
} 
+1

Có thể làm điều gì đó như thế này bằng cách sử dụng kỹ thuật bytecode và proxy, trừ khi bạn thực sự cần loại ma thuật đen này, chỉ cần sử dụng bố cục và ủy quyền. –

+2

Tại sao nó không đủ để sử dụng một phương thức lớp bên trong vô danh địa phương? Phân lớp lớp thực tế. – zeller

+0

sẽ dễ dàng hơn khi tạo động một lớp con từ một cá thể đã cho, ghi đè phương thức hành động trong lớp đó và hủy bỏ cá thể trước đó không? –

Trả lời

7

Nếu game là một giao diện hoặc thực hiện một giao diện với phương pháp act() bạn có thể sử dụng Proxy cho điều đó. Nếu giao diện nhỏ, cách thanh lịch nhất có lẽ sẽ là tạo ra một lớp thực hiện nó sử dụng Decorator design pattern.

+2

+1 cho đề xuất trang trí. Không cần phản ánh ở đây. – artbristol

+2

Trò chơi là một lớp học –

+0

Ví dụ về mã? –

1

Không thể tự động ghi đè lên các phương thức của một lớp bằng Java thuần túy. The third-party library cglib có thể tạo các lớp con động. Bạn có thể muốn kiểm tra điều đó.

Nếu bạn có thể mã chống lại giao diện, khi đó bạn có thể sử dụng Java dynamic proxy để tạo đối tượng proxy ghi đè hành vi, như ví dụ bên dưới. Giả sử Game đang triển khai giao diện IGame.

class GameInvocationHandler implements InvocationHandler 
{ 
    private Game game; 
    public GameInvocationHandler(Game game) 
    { 
     this.game = game; 
    } 
    Object invoke(Object proxy, Method method, Object[] args) 
    { 
     if (method.toGenericString().contains("act()") 
     { 
      //do nothing; 
      return null; 
     } 
     else 
     { 
      return method.invoke(game, args); 
     } 
    } 
} 

Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), IGame.class); 
IGame f = (IGame) proxyClass.getConstructor(InvocationHandler.class).newInstance(new Object[] { }); 
Các vấn đề liên quan