2012-01-15 19 views
6

Tôi có một file jar đơn giản có chứa lớp A:Scala - Năng động, tải lớp - lớp A không thể được đúc vào lớp Một

public class A {} 

Sau đó, tôi tải nó trong thời gian chạy:

var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL)) 
var clazz = classLoader.loadClass("A") 

Nó là ok, nó có thể tải lớp A. Lệnh này cũng là ok:

clazz.newInstance 

Nhưng khi tôi bỏ nó vào A:

clazz.newInstance.asInstanceOf[A] 

Tôi đã nhận lỗi này:

java.lang.ClassCastException: A cannot be cast to A 

Ông có thể giúp tôi?

+1

Bạn đang cố gắng làm gì với mã sử dụng asInstanceOf [A]. –

Trả lời

5

Mã của bạn ngụ ý rằng bạn có "A" có sẵn trong một bối cảnh lớpLoader nơi bạn đang gọi clazz.newInstance.asInstanceOf [A] là một ngữ cảnh riêng biệt từ nơi bạn nhận được đối tượng clazz. Vấn đề là bạn có hai trường hợp khác nhau của lớp "A" trong hai ngữ cảnh classLoader khác nhau. Một đối tượng được tạo ra từ một phiên bản của lớp "A" không thể được đúc thành một thể hiện của phiên bản khác trong một bối cảnh classLoader khác.

+0

Cảm ơn bạn. Nhưng nếu tôi làm điều đó trong Java, nó ổn. Bạn có thể sửa mã của tôi để tôi có thể tải một lớp và sử dụng nó không? –

+0

Tôi xin lỗi. Trên thực tế trong Java tôi có một giao diện 'I'. 'A' được thực hiện từ' I'. Khi tôi nạp 'A' từ jar, tôi kiểm tra nếu nó là instance của' I', sau đó cast sang 'I' và sử dụng. Không sao. –

+0

@HiBlack - trong Scala, đặc điểm không có triển khai phương pháp hoặc vals/vars biên dịch trực tiếp với giao diện java. Có lẽ bạn có thể làm cho "A" của bạn mở rộng một số đặc điểm "tôi", và làm cho diễn viên của bạn sau đó? – Rogach

4

Tôi gặp phải một vấn đề rất giống nhau, trong đó tôi quan sát thấy ClassCastException khi truyền một đối tượng được tải động vào giao diện được thực hiện bởi nó.
Nhờ câu trả lời của Neil, tôi đã có thể xác định rằng ClassCastException là do có các bối cảnh trình tải lớp khác nhau.

Để khắc phục điều này, tôi đã sử dụng hàm tạo URLClassLoader(URL[] urls, ClassLoader parent) thay vì hàm tạo URLClassLoader(URL[] urls).

+0

Thx, điều này thực sự giải quyết được vấn đề của tôi. –