Как сделать приведение класса?!

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;
    }
}
Теги:
ClassLoader, Java, Class
Добавлено: 19 Июля 2017 03:39:15 Добавил: Кирилл Романенко Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...