Tôi hiện đang tạo một hệ thống plugin (Lần thử đầu tiên), nhìn vào mã người khác Tôi đang cố gắng ghép các bộ nạp lớp của riêng mình và tải các plugin từ một thư mục. tập tin)Java - Tự động tải các lớp học
Vấn đề của tôi là bất cứ khi nào tôi cố gắng tải lớp đó bằng trình nạp lớp của tôi, mọi nhập trong plugin tham chiếu chương trình không được trình nạp lớp tìm thấy. (ví dụ: MyClass mở rộng Plugin, com.mgmc.plugins noclassdeffound) Không gian tên khác nhau?
Một số mẫu mã: Classloader:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.mcgm.game.provider;
import com.mcgm.utils.Misc;
import com.mcgm.utils.Paths;
import java.awt.AWTPermission;
import java.io.*;
import java.net.MalformedURLException;
import java.net.SocketPermission;
import java.net.URL;
import java.security.CodeSigner;
import java.security.CodeSource;
import java.security.Permissions;
import java.security.ProtectionDomain;
import java.util.PropertyPermission;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Tom
*/
public class GameClassLoader extends ClassLoader {
private final ProtectionDomain domain;
private final URL base;
public GameClassLoader(final URL url) {
base = url;
final CodeSource codeSource = new CodeSource(base, (CodeSigner[]) null);
domain = new ProtectionDomain(codeSource, getPermissions());
}
public void loadGames() {
for (File f : Paths.compiledFolder.listFiles()) {
try {
Class c = loadClass(f.getPath());
Misc.outPrint(c.getName());
} catch (ClassNotFoundException ex) {
Logger.getLogger(GameClassLoader.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private Permissions getPermissions() {
final Permissions ps = new Permissions();
ps.add(new AWTPermission("accessEventQueue"));
ps.add(new PropertyPermission("user.home", "read"));
ps.add(new PropertyPermission("java.vendor", "read"));
ps.add(new PropertyPermission("java.version", "read"));
ps.add(new PropertyPermission("os.name", "read"));
ps.add(new PropertyPermission("os.arch", "read"));
ps.add(new PropertyPermission("os.version", "read"));
ps.add(new SocketPermission("*", "resolve"));
ps.add(new FilePermission(Paths.compiledFolder.getPath(), "read,write,delete"));
ps.setReadOnly();
return ps;
}
@Override
@SuppressWarnings("rawtypes")
public Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
Class clazz = findLoadedClass(name);
if (clazz == null) {
try {
byte[] bytes = loadClassData(name);
clazz = defineClass(name, bytes, 0, bytes.length, domain);
if (resolve) {
resolveClass(clazz);
}
} catch (final Exception e) {
clazz = super.loadClass(name, resolve);
}
}
return clazz;
}
public byte[] loadClassData(final String name) {
try {
final InputStream in = getResourceAsStream(name.replace('.', '/') + ".class");
final byte[] buffer = new byte[4096];
final ByteArrayOutputStream out = new ByteArrayOutputStream();
int n;
while ((n = in.read(buffer, 0, 4096)) != -1) {
out.write(buffer, 0, n);
}
return out.toByteArray();
} catch (IOException ex) {
Logger.getLogger(GameClassLoader.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@Override
public URL getResource(final String name) {
try {
return new URL(base, name);
} catch (final MalformedURLException e) {
return null;
}
}
@Override
public InputStream getResourceAsStream(final String name) {
try {
return new URL(base, name).openStream();
} catch (final IOException e) {
return null;
}
}
}
Plugin Tôi tải: (Chú thích không tìm thấy một trong hai)
import com.mcgm.GameInfo;
import com.mcgm.game.Minigame;
@GameInfo(name = "RandomGame",
description = "A really long and boring game.",
authors = {"Tom", "Is", "The", "Greatest"},
version = 0.1,
maxPlayers = 100,
teamBased = false,
teamAmount = -1,
PvP = false)
public class game extends Minigame {
}
Làm thế nào tôi gọi lớp được nạp :
GameClassLoader classLoader = new GameClassLoader(Paths.compiledFolder.toURI().toURL());
classLoader.loadClass("game", true);
Tôi thấy điều này là tầm thường đối với những người biết họ đang làm gì!
bạn không phải là người chịu trách nhiệm. Những người trên SO đang đặt câu hỏi hoặc trả lời họ. Thật tuyệt. –
Tôi ngạc nhiên: bạn không có gói nào? Tôi hy vọng classLoader.loadClass ("a.b.c.d.game", true); – Aubin
Tôi đang cố gắng không thêm gói, Chỉ vì cách tôi muốn mọi người có thể thêm minigames của riêng mình - tôi biết nó đi ngược lại quy ước nhưng theo cách này tôi có thể có tất cả minigames trong một thư mục (Hoặc Jar) Cuối cùng nó sẽ quét thư mục cho tất cả các tệp, kiểm tra tệp .class và .jar và tải chúng (Không gói nào nghĩa là không có thư mục con quét) –