2016-06-18 2 views
6

와의 java.io.Serializable을 받고 때 다음과 같은 코드를 가지고 :와 Javassist NotFoundException JDK9

private static CtClass resolveCtClass(String clazz) throws NotFoundException { 
    ClassPool pool = ClassPool.getDefault(); 
    return pool.get(clazz); 
} 

JDK9 환경에서 실행할 때이 방법을 java.io.Serializable를 사용하여 호출하는 경우, JDK8에서 실행, 그것은 작동하지만, NotFoundException을 던집니다.

여기에 간과되는 것이 있습니까?

답변

6

이것은 현재 Java 9의 현재 EA 빌드에서 더 이상 발생하지 않습니다. 클래스 파일이 모듈에 캡슐화되어 있어도 클래스 파일은 항상 위치 지정 가능합니다.

이것은 내 보낸 리소스가 더 이상 ClassLoader API를 통해 사용할 수없는 Java 9 모듈 캡슐화의 결과입니다. 커버에서와 Javassist는 Serializable의 클래스 파일 잡아

ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class"); 

를 호출합니다. 그런 다음이 클래스 파일을 구문 분석하고 Java 리플렉션 API와 유사하지만로드하기 전에 클래스를로드하지 않고 정보를 표시하여로드하기 전에 편집 할 수 있습니다.

Java 8까지이 클래스 파일은 대부분 클래스 로더가 위의 호출이 파일을 가리키는 URL을 반환하도록 클래스 파일을로드하기 전에 찾아야하므로 액세스 할 수있었습니다. Java 9부터 명명 된 모듈의 리소스는 새 API 메소드 findResource(String, String)을 통해서만 사용할 수 있습니다. 여기서 두 번째 인수는 해당 클래스의 모듈 이름을 지정합니다.

Javassist는 Java 9에서 더 이상 작동하지 않으며 its dependant projects은 아무 것도하지 않습니다. 현재 Java 9 구현을 사용하는 known issue이며 릴리스 전에 수정 될 것으로 기대됩니다.

1

documentation of ClassPool 말한다 (I가와 Javassist 그래서 난 그냥 ... 여기, 어둠 속에서 촬영하고있어 사용되지 않음) :

get() 경우이 객체에서 호출되어, 다양한 소스를 검색 ClassPath으로 표시된 클래스 파일을 찾은 다음 해당 클래스 파일을 나타내는 CtClass 개체를 만듭니다.

이것은 클래스 경로의 개념에 묶여있는 것으로 보입니다. ClassPathCtClass을 보면 해당 가정을 지원합니다.

그렇다면 Javassist는 JDK 9의 새로운 modules을 조사하기에 적합하지 않을 수 있습니다.

내 추측이 맞으면 JDK 클래스를 풀에서 가져올 수 없습니다. 이것은 쉽게 검증 할 수 있어야합니다.

관련 문제