2016-06-18 13 views
6

Tôi có đoạn mã sau:Javassist NotFoundException khi nhận java.io.Serializable với JDK9

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

Khi chạy trong JDK8, nếu phương pháp này được gọi là sử dụng java.io.Serializable, nó hoạt động, nhưng khi chạy trong môi trường JDK9 , nó ném NotFoundException.

Có điều gì tôi bỏ qua ở đây không?

Trả lời

6

Điều này không còn xảy ra với các bản dựng EA hiện tại của Java 9. Các tệp lớp bây giờ luôn luôn có thể định vị ngay cả khi chúng được đóng gói trong một mô-đun.

Đây là hậu quả của việc đóng gói mô-đun của Java 9 nơi tài nguyên không được xuất không còn có sẵn thông qua API ClassLoader. Dưới bìa, Javassist gọi

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

để giữ tập tin lớp học cho Serializable. Sau đó nó phân tích cú pháp tệp lớp này và biểu diễn thông tin tương tự như API phản chiếu Java nhưng không tải lớp đó sao cho nó có thể được chỉnh sửa trước khi tải nó. Cho đến Java 8, tệp lớp này có thể truy cập được vì hầu hết các trình nạp lớp dựa vào việc tìm kiếm tệp lớp trước khi tải nó sao cho lệnh gọi ở trên trả lại một URL trỏ đến tệp. Kể từ Java 9, tài nguyên của các mô-đun được đặt tên chỉ có sẵn thông qua phương thức API mới findResource(String, String) trong đó đối số thứ hai đặt tên cho mô-đun của lớp đó.

Câu trả lời ngắn gọn là: Javassist không còn hoạt động với Java 9 nữa và không có yêu cầu nào về số its dependant projects. Đây là một known issue với việc triển khai Java 9 hiện tại và hy vọng sẽ được sửa trước khi phát hành.

1

(tôi không bao giờ sử dụng Javassist vì vậy tôi chỉ chụp trong bóng tối, ở đây ...)

Các documentation of ClassPool nói:

Nếu get() được gọi trên đối tượng này, nó tìm kiếm nhiều nguồn khác nhau được đại diện bởi ClassPath để tìm tệp lớp và sau đó nó tạo đối tượng CtClass biểu thị tệp lớp đó.

Điều này dường như bị ràng buộc với khái niệm về đường dẫn lớp. Nhìn vào ClassPathCtClass hỗ trợ giả định đó.

Nếu đúng như vậy, thì Javassist có thể không phù hợp để xem xét thương hiệu mới JD2 9 modules.

Nếu dự đoán của tôi là chính xác, bạn sẽ không thể nhận được bất kỳ lớp nào của lớp JDK JDK. Điều này phải dễ dàng xác minh được.

Các vấn đề liên quan