java.lang.ClassFormatError ... - xrath.com 에서 번역됨

> ## 애플릿을 실행하면(자) `java.lang.ClassFormatError` 가 throw 된다

> ###
> 증상

> > 애플릿을 Sun JVM 를 사용한 브라우저로 실행하고 있는 경우,`ClassFormatError` 가 `ClassLoader` 로 throw 됩니다. 같은 애플릿이 Microsoft VM 에서는 실행할 수 있습니다.

> ### 원인

> > 이 에러는, 낡은 JDK 1.0. 2 나 1.1 컴파일러, 또는 서드 파티의 오브파스케이타에 의해 생성된 바이트 코드가 원인으로 발생합니다. 지금까지, 해당하는 컴파일러나 오브파스케이타에 의해 많은 바이트 코드가 생성되고 있습니다만, 모두 Java VM 스펙에 준거하고 있습니다. 최근의 J2SE 릴리스 말하고 리파이아는 부정한 클래스 포맷에 관해서 매우 엄격해지고 있기 (위해)때문에, 이러한 부정한 클래스 파일이 로드 되면(자) VM 에 의해 `ClassFormatError` 가 throw 됩니다.

> > 낡은 클래스 파일에 관한 전형적인 문제점은 이하대로입니다 (다만 모든 것을 망라한 것은 아니다).

> > - 클래스 파일의 마지막에 여분의 바이트가 존재한다
> > - 클래스 파일에, 문자로 시작되지 않는 메소드명이나 필드명이 포함되어 있다
> > - 클래스가 다른 클래스의 private 멤버에게 액세스 하려고 한다
> > - 클래스 파일에, 부정한 정수 풀 인덱스나 부정한 UTF-8 캐릭터 라인 등, 그 외의 형식 에러가 존재한다
> > - 이전의 (서드 파티의) 바이트 코드의 오브파스케이타에 의해 생성된 클래스 파일이, 적절한 클래스 파일 형식에 위반하고 있다

> ### 해결 방법

> > 부정한 클래스 파일을 가지는 몇개의 애플릿을 Java 플랫폼에서 실행할 수 있도록(듯이) 하기 위해서, Java Plug-in 에는, 부정한 클래스 파일을 올바른 것으로 변환하는 바이트 코드 변환 프로그램이 포함되어 있습니다. 현시점에서는, 이하의 문제를 가지는 부정한 클래스 파일만이 변환됩니다.

> > - 로컬의 변수명에 부정한 정수 풀 인덱스가 존재한다
> > - 클래스 파일의 마지막에 여분의 바이트가 존재한다
> > - code segment의 길이가 잘못하고 있다
> > - 부정한 필드/메소드명
> > - 부정한 필드/메소드 수식자
> > - 로컬 var 테이블에 있어서의 부정한 start_pc/length

> > 그러나, 바이트 코드 변환 프로그램에서는, 이하의 문제를 변환할 수 없습니다. 그 때문에, 여전히 `ClassFormatError` 가 발생합니다.

> > - 비가상 함수 호출의 부정한 사용
> > - 인수가 로컬에 적합할 수 없다
> > - 룩 업 스윗치가 소트 되지 않는다
> > - 클래스 파일의 잘라서 버림

> > 이러한 문제는, JDK 에 있는 `javac` 컴파일러를 사용해 Java 클래스를 재컴파일 하는 것만으로 해결합니다. 서드 파티의 오브파스케이타를 사용하는 경우는, 그것이 올바른 클래스 파일 형식에 준거한 클래스 파일을 작성할지 어떨지를 확인해 주세요.

> ### 상세 정보

> 없음