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


83

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

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

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


이 문제를 테스트하기위한 샘플 코드 github.com/Aksi0m/SampleFor123686419
Prags

Google 팀 issuetracker.google.com/issues/123736741의 응답에 따라이 문제는 내부적으로 해결되었으며 다음 Navigation 릴리스에서 사용할 수 있습니다.
Prags

답변:


111

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

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

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

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

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

최신 정보:

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

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


1
좋아요, 익명의 수업을하는 것이 나쁜가요? 어떻게 작동하는지 잘 모르겠습니다. 클래스에서 클래스의 새 인스턴스 변수를 만들면 익명 클래스입니까?
Frizinator 2012

익명의 클래스를 갖는 것은 나쁘지 않으며 사용법에 따라 다릅니다. 내 게시물 업데이트
mprabhat

4
클래스 본문을 포함하는 열거 형은 열거 형 클래스를 확장하는 익명 내부 클래스를 자동으로 생성하므로 $가있는 다른 클래스 파일이 생성됩니다.
dlaidlaw

1
또한 내부 클래스가 비공개 인 경우 OuterClass $ 1.class라는 이름의 추가 클래스가 생성됩니다.
SandeepGodara

@mprabhat : 안드로이드 스튜디오에 이러한 클래스의 계층 또는 목록을 볼 수있는 메커니즘이 있습니까?
user1090751 2010 년


9

@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 파일에 대한 내 검사의 파생물입니다.


이러한 기준을 충족하지 않는 클래스가 있으며 class.getName ()은 여전히 ​​잘못되었습니다. Group.java의 경우 Group _ $$ _ jvst248_20을 반환합니다. 나는 무슨 일이 일어나고 있는지 전혀 모른다. 분명히 열거, 확장 또는 구현이 없습니다.
Amalgovinus

0

귀하의 의견에 대한 답변은 익명의 수업이 나쁩니다. 그들은 확실히 그렇지 않습니다. 액션 리스너를 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을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.