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() {
};
}
생성 될 클래스는 다음과 같습니다.
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
최신 정보:
익명 클래스를 사용하는 것은 나쁜 습관으로 간주되지 않으며 사용법에 따라 다릅니다.
SO에 대한 이 토론을 확인하십시오.
답변
이 큰 클래스 내에 익명 클래스가 있기 때문입니다. 이 명명 규칙을 사용하여 컴파일됩니다.
참조 익명 클래스 수수께끼를
답변
@mprabhat에서 제시 한 위의 경우 외에도 다른 경우는 다음과 같습니다.
- 클래스에 열거 형 변수가 포함되어 있으면 별도의 클래스도 생성됩니다. 생성 된 .class의 이름은 ClassName $ Name_of_enum 입니다.
- 클래스 X 가 상속하는 경우 즉 , 다른 클래스 Y를 확장 하면 ClassName $ 1.class 또는 ClassName $ 1 $ 1.class 라는 이름으로 생성 된 .class가 있습니다.
- 클래스 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을 볼 수 있습니다.