Tôi đang tải các lớp qua ClassLoader:
Class> clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).replaceAll("/", "."));
System.out.println(clazz);
System.out.println(clazz.isInstance(SkillCast.class));
System.out.println(SkillCast.class.isInstance(clazz));
System.out.println(SkillCast.class.isAssignableFrom(clazz));
System.out.println(clazz.isAssignableFrom(SkillCast.class));
Đây là cấu trúc của tôi:
lớp công khai SkillFireball mở rộng SkillCast triển khai ISkillThrown
lớp trừu tượng công khai SkillCast mở rộng Skill
Kết quả in ra là:
kỹ năng lớp học.SkillFireball
SAI
SAI
SAI
SAI
Tôi chắc chắn clazz là SkillFireball và tôi có thể in tên trường/phương thức.
Làm cách nào để kiểm tra xem clazz có phải là con của SkillCast không?
biên tập
URLClassLoader tĩnh riêng tư urlClassLoader;
và mã:
ClassLoader cl = Loader.instance().getModClassLoader();
urlClassLoader = URLClassLoader.newInstance(urls.toArray(URL mới[urls.size()]), cl);
Vị trí được trả về bởi #getModClassLoader():
// Trình nạp lớp mà chúng tôi tải các mod vào.
modClassLoader riêng tư modClassLoader;
bên cạnh đó:
lớp công khai ModClassLoader mở rộng URLClassLoader
Cách hoạt động: API Minecraft Forge đang tải @Mods. Mod của tôi cung cấp SkillCast.class và khi tải nó sẽ cố đọc thư mục trò chơi và tải lớp trong tệp .jar. Bây giờ - tôi không biết mình nên làm gì nữa :C
Tôi đã làm nó.
Vấn đề thực sự là do tôi thiếu hiểu biết về cách thức hoạt động của classLoader-parenting và cách Java tải các lớp.
Điều này được thực hiện bằng cách tạo một URLClassLoader mới và đặt cha mẹ thành ClassLoader được sử dụng bởi chính chương trình chính (được đề cập bởi @Mod).
SkillCast.class được nạp bởi ClassLoader của Mod nên khi thêm lớp mới (SkillFireball) tôi cũng cần sử dụng lớp của Mod thay vì sử dụng lớp mới như trước.
Lớp> clazz = Loader.instance().getModClassLoader().loadClass(...)
Đây thực sự không phải là một "câu trả lời", chỉ là một bài viết để kết thúc câu hỏi.
Tôi là một lập trình viên xuất sắc, rất giỏi!