2011-10-24 26 views
13

Tôi muốn xác định trình chặn đánh chặn phương thức trong một chương trình Java nói cách khác tôi muốn có một hành vi được thực thi tại mỗi cuộc gọi phương thức. Ứng dụng này không được thực hiện trong một máy chủ ứng dụng và do đó tôi không thể sử dụng EJB xung quanh gọi các bộ chặn. Tôi đã tìm thấy một Proxy API ngơi thoải mái tại các thư viện chuẩn của Java nhưng nó bị giới hạn bởi vì nó cần một giao diện trong việc tạo ra proxy:Proxy động cho các lớp cụ thể

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), 
             new Class[] { Foo.class }, 
             handler); 

Có một API tương tự mà không buộc Foo.class được khai báo là một giao diện?

Trả lời

7

Tại sao không sử dụng CGLIB? Xem this article để biết thêm thông tin.

Điều gì xảy ra nếu bạn muốn proxy lớp cũ không có giao diện? Bạn có thể sử dụng CGLIB. CGLIB là một thư viện thế hệ mạnh mẽ, hiệu suất cao . Dưới trang bìa, nó sử dụng ASM, một khung điều khiển bytecode nhỏ gọn nhưng nhanh chóng , để chuyển đổi mã byte hiện tại thành tạo các lớp mới. CGLIB nhanh hơn phương pháp tiếp cận proxy động JDK. Về cơ bản, nó tạo động một lớp con để ghi đè lên các phương thức không phải là cuối cùng của lớp được ủy quyền và nối các móc đó gọi lại cho các trình chặn chặn do người dùng định nghĩa.

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html – eliocs

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/MethodInterceptor.html – eliocs

+0

Tôi mới tới CGLIB. Sự hiểu biết của tôi là nó tạo ra lớp nhị phân trong bộ nhớ, nhưng trình nạp lớp hiện có chỉ tải lớp từ hệ thống tệp, vậy làm thế nào nó sử dụng trình nạp lớp của chính nó? – Chao

1

Rất tiếc, không có API nào cho lớp học. Nhiều khung công tác đang sử dụng các thư viện thế hệ bytecode như CGLIB để đạt được điều này.

1

Bạn có thể thử một trong các lớp chế nhạo. Cách tiếp cận đơn giản nhất có thể là lớp phụ, lớp học của bạn. Hoặc bạn có thể sử dụng AOP để chèn mã đăng nhập mà bạn muốn.

0

sun.misc.ProxyGenerator có thể được sử dụng để tạo các lớp proxy và không kiểm tra xem "giao diện" của chúng là tất cả các giao diện hay không. Phương thức generateClassFile của nó cung cấp cho bạn bytecode như một mảng byte, mà bạn có thể lưu để liên kết đến các bản dựng sau hoặc thay đổi bằng các công cụ của bên thứ ba.

Lưu ý rằng nếu bất kỳ "giao diện" nào có phương thức cuối cùng, bạn sẽ gặp lỗi khi bạn cố gắng tải lớp.

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