Как сделать приведение класса?!
package mods;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import autorizer.Out;
import resourses.Registry;
public class PluginLoader extends ClassLoader {
private Map<String, Class<?>> cacheClass = new HashMap<>(); //карта: имя мода, тело мода.
private ClassLoader parent;
private Boolean test = true;
public static boolean Locker = false; //маркер уже пройденной загрузки модов.
public PluginLoader(ClassLoader parent) {this.parent = parent;}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> result = cacheClass.get(name);
if (result == null) {result = parent.loadClass(name);}
return result;
}
public void loadPlugins(ArrayList<String> modsNamesArray) throws IOException {
for (int i = 0; i < modsNamesArray.size(); i++) {
JarFile jarFile = new JarFile(Registry.modsPath + (modsNamesArray.get(i)));
Enumeration<JarEntry> jarEntries = jarFile.entries();
ArrayList<JarEntry> tmp = new ArrayList<JarEntry>();
tmp.add(jarEntries.nextElement());
for (Iterator<JarEntry> iterator = tmp.iterator(); iterator.hasNext();) {Out.Print("" + tmp.iterator().next());}
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
if (jarEntry.isDirectory())
continue;
if (jarEntry.getName().endsWith(".class")) {
byte[] classData = loadClassData(jarFile, jarEntry);
if (classData != null) {
String jarEntryReplace = jarEntry.getName().replace('/', '.');
String jarCutted = jarEntryReplace.substring(0, jarEntry.getName().length() - 6);
Class<?> clazz = null;
clazz = defineClass(jarCutted, classData, 0, classData.length);
test = testNewMod(clazz);
if (test) {
cacheClass.put(jarCutted, clazz);
//запуск мода:
Out.Print("PluginLoader: loadPlugins:", 1, "Тест " + jarFile + " прошел успешно! Запуск мода...");
try {((IPlugin) AddMods.modClassLoader.loadClass(Registry.modsPath + (modsNamesArray.get(i))).newInstance()).run();} catch (Exception e) {e.printStackTrace();}
}
} else {Out.Print("PluginLoader: loadPlugins:", 3, "При чтении класса мода " + jarFile + " произошла ошибка!");}
}
}
Out.Print("PluginLoader: loadPlugins: ", 1, "Подключение модов завершено! Блокировка проверки модов.");
Locker = true; //теперь повторно подключать моды уже нельзя.
}
}
private Boolean testNewMod(Class<?> clazz) {
if (clazz.getName().endsWith("Plugin")) {
Out.Print("PluginLoader: testNewMod: ", 1, "Попытка протестировать мод: " + clazz.getName());
//КАК ЭТО СДЕЛАТЬ?!?!?!?!?
if (((ModExample)clazz).getModName().equals("")) {
Out.Print("PluginLoader: testNewMod: ", 3, "ПРОВАЛ СИСТЕМЫ ТЕСТОВ МОДОВ!");
return false;
} else {Out.Print("PluginLoader: testNewMod: ", 1, "УДАЧА СИСТЕМЫ ТЕСТОВ МОДОВ! Плучено имя: " + "(Установить имя блять сюда надо будет!)");}
}
Out.Print("", 1, "Попытка вложить мод: " + clazz.getName());
return true;
}
private byte[] loadClassData(JarFile jarFile, JarEntry jarEntry) throws IOException {
long size = jarEntry.getSize();
if (size <= 0) {return null;
} else if (size > Integer.MAX_VALUE) {throw new IOException("Class size too long");}
byte[] buffer = new byte[(int) size];
InputStream is = jarFile.getInputStream(jarEntry);
is.read(buffer);
is.close();
return buffer;
}
}
Комментарии:
Нету комментариев для вывода...