2010-11-28 5 views
0

클래스 패스에서 바이트 코드를 읽고 향상시키고 클래스를 정의해야하는 자체 클래스 로더를 정의했습니다. 초기 구현에는 다음과 같은 행이 있습니다.클래스 패스에서 바이트 코드 읽기

getResourceAsStream(name.replaceAll("\\.", File.separator)+".class"); 

그러나 나는 해킹을하지 않은 것으로 보입니다. 나는이 라인이 제대로 처리하지 못하는 중첩 된 서브 클래스와 같은 경계 조건을 실행하고있다.

올바른 해결책은 무엇입니까?

감사합니다. name이 클래스 바이너리 이름을 경우

+0

리소스에는 항상'/'- 분리 된 경로 이름이 있습니다. (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html 참조) – dacwe

답변

0

, 다음 리소스 파일 이름은 통상적으로 다음과 같습니다

separator + name.replaceAll("\\.", separator) + ".class" 

클래스의 binary name는 바이트 코드 파일에 사용되는 값 및 Class.getName()에 의해 반환됩니다.

리소스 이름 구분 기호는 반드시 File.separator과 같을 필요가 없습니다. 예를 들어 클래스 로더가 JAR 파일에서로드하는 경우 파일 시스템 규칙이 아닌 JAR 파일 API로 구분 기호가 정의됩니다.

중첩 된/익명의 클래스에 대해 이진 이름을 사용했다면 모든 작업이 가능합니다. 그러나 정규화 된 클래스 이름을 이진 클래스 이름에 매핑하는 것은 컴파일러에 따라 다르며 자동으로 쉽게 재현 할 수 없습니다. (컴파일러가 $n 이름 구성 요소를 할당하기 위해 사용하는 구성표를 재현해야하며 소스 코드에 액세스해야합니다.) 따라서 클래스 로더가 완전한 이름을 이해하도록하는 것은 어려울 것입니다. 그러나 정상적인 클래스 로더가 그렇지 않기 때문에 괜찮습니다.

마지막으로, "전통적으로"말했음을 유의하십시오. 이론적으로 매핑을 일관성있게 수행하는 방법을 파악할 수 있다면 어떤 클래스 파일 명명 체계라도 구현할 수 있습니다.

+0

기본 클래스 로더가 어쨌든 클래스를 식별하는 방법을 필요로하는 것처럼 보입니다. 이미 존재하는 검색 메커니즘을 활용할 수있는 방법이 있을까요? – Jim

관련 문제