2011-09-05 26 views
6

Chúng ta có một codebase rất lớn và một số lớp thường được sử dụng thông qua sự phản chiếu trên toàn bộ mã. Chúng tôi có thể loại bỏ các lớp và trình biên dịch một cách an toàn, nhưng một số trong số chúng được sử dụng tự động bằng cách sử dụng sự phản chiếu để tôi không thể định vị chúng bằng cách tìm kiếm ...Java: Xác định vị trí cách sử dụng mã phản chiếu

Có một số trình khám phá phản chiếu cho mã Java không?

+0

như thế nào là lớp học đang được sử dụng động là họ nạp sử dụng tên đầy đủ của họ như là một chuỗi hoặc được sử dụng trong một kịch bản đó là đánh giá khi chạy? –

+0

tên đầy đủ dưới dạng chuỗi – Xorty

+0

Tránh làm điều đó nếu có thể. Lý do các ngôn ngữ an toàn như Java rất mạnh mẽ và được sử dụng trong các hệ thống doanh nghiệp là việc kiểm tra kiểu thời gian biên dịch có thể tìm thấy hầu hết các xung đột kiểu tại thời gian biên dịch - ngoại trừ nếu bạn sử dụng sự phản chiếu để làm những việc nhất định - thì tất cả mọi phiên cược đều bị tắt và bạn quay lại thời đại đen tối của lập trình mà mã của bạn được nhúng với 'mỏ' có thể tắt bất cứ lúc nào khi một trong những người dùng của bạn chỉ xảy ra để thực hiện một đoạn mã theo cách mà bạn không nghĩ đến thử nghiệm. – Volksman

Trả lời

3

Tôi đề xuất, sử dụng nguồn được cấp phép phù hợp cho JRE của bạn, sửa đổi lớp phản chiếu để ghi nhật ký khi lớp được sử dụng bằng cách phản chiếu (sử dụng bản đồ/WeakHashMap để bỏ qua trùng lặp). Các lớp hệ thống đã sửa đổi của bạn có thể thay thế các lớp đó trong rt.jar bằng -Xbootclasspath/p: trên dòng lệnh (trên Oracle "Sun" JRE, các lớp khác có lẽ sẽ có thứ gì đó tương tự). Chạy chương trình và kiểm tra của bạn và xem những gì đi lên.

(Có thể bạn có thể phải hack xung quanh vấn đề với trật tự lớp tải trong các lớp hệ thống.)

+0

Nhưng điều này sẽ chỉ tìm thấy những gì đã được tải trong chạy cụ thể của chương trình. Những gì tôi đề nghị là để làm điều tương tự tĩnh, và nó không đòi hỏi phải trải qua nỗi đau của việc sửa đổi các lớp học. Quan tâm đến nhận xét của bạn. Cảm ơn. –

+1

@Hemal Loại phụ thuộc vào phản ánh đang được sử dụng. Việc sử dụng phản chiếu hữu ích hơn sẽ không có các chuỗi được mã hóa cứng. Nếu các chuỗi được mã hóa cứng, thì tôi đề nghị grepping cho 'java.lang.reflect' và loại bỏ sự phản chiếu. –

4

Không có công cụ đơn giản nào để thực hiện việc này. Tuy nhiên, bạn có thể sử dụng mã vùng để thay thế. Điều này làm cho bạn một báo cáo về tất cả các dòng mã được thực hiện. Điều này thậm chí có thể hữu ích hơn trong việc cải thiện mã kiểm tra hoặc xóa mã chết.

Phản ánh theo định nghĩa rất năng động và bạn phải chạy đúng mã để xem nó sẽ làm gì. tức là bạn phải có các bài kiểm tra hợp lý. Bạn có thể thêm thông tin đăng nhập vào mọi thứ mà Reflection thực hiện nếu bạn có thể truy cập vào mã này hoặc có thể bạn sử dụng các thư viện này (hoặc thay đổi trực tiếp)

0

Tôi nghi ngờ mọi tiện ích này sẵn có, nhưng tôi có thể sai. Điều này khá phức tạp, xem xét rằng các lớp được nạp động (thông qua sự phản chiếu) có thể tự nạp các lớp khác một cách động và tên của các lớp được nạp có thể đến từ các biến hoặc một số đầu vào thời gian chạy.

Cơ sở mã của bạn có thể không thực hiện việc này. Nếu điều này một lần nỗ lực tìm kiếm chuỗi có thể là một lựa chọn tốt. Hoặc bạn tìm kiếm các cuộc gọi đến các phương thức phản chiếu.

0

Như các áp phích khác đã đề cập, điều này không thể được thực hiện với phân tích tĩnh do tính chất động của Reflection. Nếu bạn đang sử dụng Eclipse, bạn có thể thấy công cụ bảo hiểm này hữu ích và rất dễ làm việc với nó. Nó được gọi là EclEmma

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