2011-07-29 49 views
10

Có thể nhập và sử dụng hai lớp khác nhau có cùng tên và gói trong java không?Có thể sử dụng hai lớp java có cùng tên và cùng một gói không?

Ví dụ: giả sử tôi có hai lớp có tên "com.foo.Bar" hơi khác một chút. Tôi muốn có thể sử dụng cả hai, nhưng tôi có một hạn chế (vì crap phản xạ ngu ngốc) buộc tôi phải giữ tên và gói giống nhau.

Có một số tính năng của java cho phép tôi nhập và tách riêng từng lớp này không?

Để xây dựng, tôi đã thay đổi lược đồ avro theo những cách mà chúng không bao giờ được thay đổi (oops!) Và bây giờ tôi muốn quay lại và thay đổi các tệp cũ không thể đọc được bằng lược đồ mới vào các tệp có thể được đọc bởi lược đồ mới của tôi. Avro dường như buộc bạn phải sử dụng một lớp học cụ thể và tên gói để tải các tập tin.

+0

Đây là lỗi biên dịch nếu tên của loại cấp cao nhất xuất hiện dưới dạng tên của bất kỳ loại cấp cao nhất hoặc loại giao diện nào được khai báo trong cùng một gói. – roshan

Trả lời

5

Không, gói java được sử dụng chính xác để tránh sự cố đó.

+1

Tôi không nghĩ ý tưởng lớp bao bọc sẽ hoạt động. Để cho 2 lớp được đặt tên giống nhau là C1 và C2; và trình bao bọc tương ứng của chúng W1 và W2. Trình nạp lớp sẽ (1) nạp W1 sẽ làm cho nó (2) tải C1. Sau đó, trình nạp lớp sẽ (3) tải W2. Nó sẽ nghĩ rằng nó đã được tải C2 (vì tên giống hệt nhau) và lớp W2 của bạn sẽ quấn C1. – emory

0

Không có không gian tên trong Java, chỉ trong C#, vì vậy tôi giả sử bạn có nghĩa là các gói. Chỉ có thể có một tên đủ điều kiện cho mỗi dự án.

0

Về mặt kỹ thuật, nó có thể được thực hiện bằng cách sử dụng một số thủ thuật cấp thấp chẳng hạn như viết lại mã cấp byte. Theo như tôi biết crypter java khác nhau/encrypters làm việc như thế - họ có rất nhiều lớp học được gọi là A.class B.class C.class, vv

+0

Nó không phải là cấp thấp hoặc thủ đoạn. Các cá thể trình nạp lớp riêng biệt là cách để đi. – Mishax

0

Nếu bạn thực sự chắc chắn nhất phải làm điều gì đó như điều này, bạn có thể đạt được nó bằng cách sử dụng các trình nạp lớp khác nhau và có thể là sự phản chiếu.

Đây không phải là cách Java hoạt động và nó không được cho phép vào mục đích - bạn không nên làm những điều ngu ngốc sẽ làm hỏng mọi thứ cho bạn.

6

Có. Bạn sẽ cần phải triển khai Classloader của riêng bạn và chơi một số trò chơi để có thể truy cập cả trong suốt thời gian chạy.

Tôi chắc chắn điều này là có thể, bởi vì tôi gặp phải vấn đề khó gỡ lỗi khi người nào đó có Trình nạp lớp lạ trong sản phẩm của họ đang tải lên thư viện và cung cấp 2 phiên bản khác nhau của cùng một tệp từ 2 phiên bản khác nhau của thư viện.

Tuy nhiên, điều này nghe có vẻ như ý tưởng xấu INCREDIBLY. Tôi sẽ quay lại và tìm một cách khác để khắc phục vấn đề của bạn. Điều này sẽ chỉ mang lại cho bạn đau lòng về lâu dài. Heck, nó có thể là, khi bạn điều tra bộ nạp lớp.

EDIT: Để cụ thể, bạn không thể "nhập" cả hai. Nhưng bạn có thể truy cập cả khi chạy.

+0

Tôi nghĩ bạn chỉ cần nhiều trường hợp trình nạp lớp riêng biệt (một trong số đó có thể là trình nạp lớp bootstrap) khi bạn muốn tham chiếu đến các lớp cùng tên. Bạn không thực sự cần phải viết trình nạp lớp của riêng bạn cho điều đó. – Mishax

0

Nghe có vẻ như tôi cần phải xác định chữ ký phương thức của bạn trong một giao diện gọi là com.foo.Bar. Sau đó cung cấp hai triển khai cụ thể khác nhau của giao diện (ví dụ: com.foo.DefaultBar và com.foo.SpecialBar). Bằng cách này, bạn có thể lập trình chống lại loại giao diện và chuyển đổi giữa hai triển khai khác nhau theo yêu cầu.

Bạn có thể giải thích về ý nghĩa của mình bằng "phản xạ crap" không? Điều đó có thể cung cấp thông tin chi tiết về vấn đề chính xác của bạn.

Không gây rối với trình tải lớp hoặc bất kỳ thủ thuật cấp thấp nào khác. Cách tốt nhất để giải quyết những vấn đề như vậy nó có một thiết kế rõ ràng ở nơi đầu tiên mà bất cứ ai cũng có thể hiểu được.

+1

Chúng tôi đã thay đổi lược đồ avro theo những cách chúng ta nên có vì vậy tôi đang cố gắng viết một công việc hadoop để sửa các tệp đang sử dụng các lược đồ cũ. Avro dường như buộc bạn sử dụng cùng một lớp và tên gói. – guidoism

0

Như đã đề cập bằng cách viết Trình nạp lớp của riêng bạn hoặc sử dụng thêm khung công tác OSGi như Equinox, tính năng nạp lớp cho bạn

1

Có đúng vậy. Nó yêu cầu bạn tạo ClassLoader của riêng mình, mặc dù

Tôi đã thực hiện một số demo trong số đó trên github!

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