các lớp được biên dịch java chứa các ký hiệu đô la


83

Tôi đã sử dụng Eclipse làm IDE phát triển của mình. Tôi cũng sử dụng nó để xuất ứng dụng của mình thành tệp .jar. Khi tôi xem xét các lớp của mình trong tệp .jar, một vài lớp của tôi chứa tên của lớp đó, ký hiệu đô la, sau đó là một số. Thí dụ:

  • Tìm lớp $ 1.
  • Tìm lớp $ 2.
  • Tìm lớp $ 3
  • Find.class

Tôi nhận thấy nó thực hiện điều này trên các lớp học lớn hơn. Điều này có phải là do các lớp quá lớn nên nó biên dịch nó thành nhiều lớp? Tôi đã googled và tìm kiếm trên nhiều diễn đàn, và tìm kiếm Tài liệu Java nhưng không tìm thấy bất cứ điều gì thậm chí liên quan đến nó. Ai đó có thể giải thích?


Mã mẫu để kiểm tra vấn đề này github.com/Aksi0m/SampleFor123686419
Prags

Theo phản hồi từ nhóm Google Issuetracker.google.com/issues/123736741 , điều này đã được khắc phục nội bộ và sẽ có trong bản phát hành Điều hướng tiếp theo.
Prags

Câu trả lời:


111

Các lớp bên trong, nếu có trong lớp của bạn, sẽ được biên dịch và sẽ là tệp của lớp ClassName$InnerClassName. Trong trường hợp các lớp bên trong Ẩn danh, nó sẽ xuất hiện dưới dạng số. Kích thước của lớp (Mã Java) không dẫn đến việc tạo ra nhiều lớp.

Ví dụ: đưa ra đoạn mã này:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

Các lớp sẽ được tạo sẽ là:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Cập nhật:

Sử dụng lớp ẩn danh không được coi là một thực hành xấu, nó chỉ phụ thuộc vào cách sử dụng.

Kiểm tra cuộc thảo luận này trên SO


1
Được rồi, vậy có tệ không khi có một lớp ẩn danh? Tôi không hiểu nó hoạt động như thế nào. Nếu tôi tạo một biến phiên bản mới của một lớp trong một lớp, đó có phải là một lớp ẩn danh không?
Frizinator,

Không, không phải là xấu khi có lớp ẩn danh, nó phụ thuộc vào cách sử dụng. Cập nhật bài của tôi
mprabhat

4
Enum chứa một phần thân của lớp sẽ tự động tạo ra một lớp ẩn danh bên trong mở rộng lớp enum và do đó tạo ra một tệp lớp khác có $ trong đó.
dlaidlaw

1
Ngoài ra nếu lớp bên trong là một lớp tin bổ sung được tạo ra tên OuterClass $ 1.class
SandeepGodara

@mprabhat: có cơ chế nào trong android studio để xem phân cấp hoặc danh sách các lớp này không?
user1090751


9

Ngoài các trường hợp trên do @mprabhat trình bày, các trường hợp khác có thể là:

  1. nếu lớp của bạn chứa một biến enum, một lớp riêng biệt cũng sẽ được tạo cho biến đó. Tên của lớp .class được tạo sẽ là ClassName $ Name_of_enum .
  2. Nếu lớp X của bạn đang kế thừa tức là mở rộng một lớp Y khác , thì sẽ có một lớp .class được tạo với tên ClassName $ 1.class hoặc ClassName $ 1 $ 1.class
  3. Nếu lớp X của bạn đang triển khai giao diện Y , thì sẽ có một lớp .class được tạo với tên ClassName $ 1.class hoặc ClassName $ 1 $ 1.class .

Những trường hợp này là kết quả của việc kiểm tra của tôi trên các tệp .class trong jar.


Tôi có một lớp không đáp ứng các tiêu chí này và class.getName () vẫn sai-- đối với Group.java, nó trả về Nhóm _ $$ _ jvst248_20. Tôi không biết chuyện gì đang xảy ra. Chắc chắn không có enums, mở rộng hoặc thực hiện.
Amalgovinus

0

Để trả lời bình luận của bạn về các lớp ẩn danh xấu. Chúng chắc chắn là không. Hãy xem xét điều này để chỉ định một trình nghe hành động cho một JButton:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

hoặc điều này để thực hiện sắp xếp không phân biệt chữ hoa chữ thường theo thuộc tính "name"

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

Bạn cũng sẽ thấy rất nhiều Runnable và Callable được thực hiện dưới dạng các lớp ẩn danh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.