[java] 자바 컴파일 된 클래스는 달러 기호를 포함

Eclipse를 개발 IDE로 사용하고 있습니다. 또한 응용 프로그램을 .jar 파일로 내보내는데도 사용합니다. .jar 파일에서 내 클래스를 볼 때 일부 클래스에는 해당 클래스의 이름, 달러 기호, 숫자가 포함되어 있습니다. 예:

  • $ 1.class 찾기
  • $ 2.class 찾기
  • $ 3.class 찾기
  • Find.class

나는 그것이 더 큰 수업에서 이것을한다는 것을 알아 챘다. 클래스가 너무 커져서 여러 클래스로 컴파일되기 때문입니까? 나는 여러 포럼을 검색하고 살펴보고 Java 문서를 검색했지만 관련 내용조차 찾지 못했습니다. 누군가 설명 할 수 있습니까?



답변

내부 클래스 (클래스에있는 경우)가 컴파일되고 클래스 파일은 ClassName$InnerClassName. 익명 내부 클래스의 경우 숫자로 표시됩니다. 클래스의 크기 (Java 코드)는 여러 클래스를 생성하지 않습니다.

예를 들어 다음 코드가 주어집니다.

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

생성 될 클래스는 다음과 같습니다.

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

최신 정보:

익명 클래스를 사용하는 것은 나쁜 습관으로 간주되지 않으며 사용법에 따라 다릅니다.

SO에 대한 토론을 확인하십시오.


답변

이 큰 클래스 내에 익명 클래스가 있기 때문입니다. 이 명명 규칙을 사용하여 컴파일됩니다.

참조 익명 클래스 수수께끼를


답변

@mprabhat에서 제시 한 위의 경우 외에도 다른 경우는 다음과 같습니다.

  1. 클래스에 열거 형 변수가 포함되어 있으면 별도의 클래스도 생성됩니다. 생성 된 .class의 이름은 ClassName $ Name_of_enum 입니다.
  2. 클래스 X 가 상속하는 경우 즉 , 다른 클래스 Y를 확장 하면 ClassName $ 1.class 또는 ClassName $ 1 $ 1.class 라는 이름으로 생성 된 .class가 있습니다.
  3. 클래스 X 가 인터페이스 Y를 구현하는 경우 ClassName $ 1.class 또는 ClassName $ 1 $ 1.class 라는 이름으로 생성 된 .class가 있습니다 .

이 경우는 jar의 .class 파일에 대한 내 검사의 파생물입니다.


답변

귀하의 의견에 대한 답변은 익명의 수업이 나쁩니다. 그들은 확실히 그렇지 않습니다. 액션 리스너를 JButton에 할당하려면 다음을 고려하십시오.

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

또는 “이름”속성으로 대소 문자를 구분하지 않는 정렬을 수행합니다.

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

또한 익명 클래스로 실행되는 많은 Runnable 및 Callable을 볼 수 있습니다.


답변