2016-09-29 25 views
9

Tôi cung cấp API và cần biết, nơi các phương thức của API được gọi. Tôi có thể sử dụng nguyên nhân phản ánh hoặc stacktrace thread, nhưng điều đó sẽ bao gồm rất nhiều chi phí thời gian chạy.Cách xác định phương thức được gọi là

Tôi không cần tên lớp chính xác, tham chiếu duy nhất cho mỗi yêu cầu sẽ là đủ. Trong C, tôi thường sử dụng bộ tiền xử lý để tự động thêm __FILE____LINE__ vào lời gọi phương thức.

Có phương pháp nào trong Java (ngoài việc tạo mã) để nhận dạng nhận dạng người gọi duy nhất với chi phí thời gian chạy thấp không?

+2

Bản sao có thể có của http://stackoverflow.com/questions/26425049/how-to-get-a-unique-method-identifier –

+2

Chỉ cần tự hỏi: bạn có ý định giải quyết vấn đề gì ở đây? – GhostCat

+2

Có thể xem AspectJ và thiết lập điểm tham gia bất cứ khi nào API của bạn được gọi? –

Trả lời

3

Một giải pháp sẽ được để có một Throwable cache định được thông qua trong

class StackPoint { 
    Throwable stack; 
    public Throwable getStack() { 
     if (stack == null) 
      stack = new Throwable(); 
     return stack; 
    } 
} 

public void methodToCall(StackPoint sp) { 
    Throwable t = sp.getStack(); 

} 


static final StackPoint one = new StackPoint(); 

methodToCall(one); // Have to remember to give each line a different StackPoint. 

Lưu ý:. Nếu phương pháp trong đó kêu gọi người gọi này thay đổi, bạn chỉ ghi lại là người đầu tiên bao giờ hết.


Không có mẫu chuẩn và có khả năng là nếu bạn muốn điều này hiệu quả, người gọi sẽ cần phải chuyển một id duy nhất. Điều gần nhất bạn có thể làm là sử dụng lambda.

public void methodToCall(Runnable run) { 
    Class id = run.getClass(); 

} 

Bạn có thể gọi nó như thế này

methodtoCall(()->{}); 

Điều này sẽ tạo ra một lớp khác nhau cho mỗi nơi nó được gọi, thậm chí nếu nó xuất hiện nhiều lần trên cùng một dòng. Nó tạo ra không có rác vì nó tái sử dụng cùng một đối tượng mỗi lần. Bạn có thể làm ngắn này với

void methodToCall(IntFunction fun) { 

} 

và gọi

methodToCall(a->1); 
+0

Trong khi tôi không thể cấm các trang web gọi đi qua cùng một đối số hai lần thì đây là một giải pháp thực sự tốt đẹp. Nếu đối số được thông qua là không xác định, tôi sẽ sử dụng stacktrace để có được trang web cuộc gọi chính xác và sử dụng thông tin được lưu trong bộ nhớ cache. – ooxi

+1

Nhưng đếm trên danh tính của lambda là sai, phải không? –

+1

@ooxi cung cấp mã người gọi mà họ có thể sao chép và dán mà không phải thay đổi theo cách thủ công, có nghĩa là họ ít có khả năng gây rối với nó. –

1

Như một cái gì đó asynchroneous là tham gia, chia gọi lên, và để cho các API trả lại ID.

Ticket callTicket = api.call(params); 
Logger.getLogger(getClass().getName(), Level.FINE, callTicket); 
Result result = callTicket.get(); 

Phía trên có kết quả trả về (đồng bộ) có thể không phải là trường hợp với mã của bạn. Mã của bạn sẽ nhận được kết quả được xóa ở nơi khác. Nhưng đó cũng có thể là một hệ thống vé.

+0

Nhưng làm cách nào tôi có thể xác định có nên trả lại Vé mới mà không kiểm tra stacktrace không? – ooxi

+1

Mọi cuộc gọi cũng có cùng một lớp và đường vẽ một vé mới từ API. Để đăng nhập ví dụ. Trên một ngoại lệ asynchrone, vé được biết, và người ta có thể tìm kiếm trong các bản ghi. Chắc chắn một cách tiếp cận và quan điểm khác nhau. –

+0

Tôi chắc chắn thích giải pháp của bạn vì nó không cắt mã của khách hàng với các chi tiết kỹ thuật. Tuy nhiên, tôi sẽ giữ câu trả lời từ @PeterLawrey như là một chấp nhận vì nó giải quyết câu hỏi trực tiếp hơn. – ooxi

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