Всем привет!) есть вопрос, каким образом мне заменить системный загрузчик своим? у меня есть свой загрузчик и с помощью его я запускаю программу, вот пример:
Код | public class Loader { public static void main(String[] args) { DinamicClassLoader classLoader = new DinamicClassLoader(); classLoader.addClassPath("C:/Documents and Settings/Antosha/Мои документы/NetBeansProjects/test/build/classes"); try { Class module = Class.forName("test.TestModule", true, classLoader); Method main = module.getMethod("main", new Class[] {String[].class}); main.invoke(module, new Object[]{args}); }catch(Exception ex) { ex.printStackTrace(); } } }
|
А вот сам загрузчик:
Код | public class DinamicClassLoader extends ClassLoader { private Map<String,Class> classCash = new HashMap<String,Class>(); private List<String> classPath = new ArrayList<String>();
public DinamicClassLoader() { }
@Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class result= findClass(name); if(resolve) resolveClass(result); return result; }
@Override protected Class<?> findClass(String name) throws ClassNotFoundException { Class result= (Class)classCash.get(name); if(result!=null) return result; File f= findFile(name.replace(".",File.separator),".class"); if(f == null) return findSystemClass(name); try { byte[] classBytes = loadFileAsBytes(f); result = defineClass(name, classBytes, 0, classBytes.length); }catch(IOException e) { throw new ClassNotFoundException("Cannot load class "+name+": "+e); }catch(ClassFormatError e) { throw new ClassNotFoundException("Format of class file incorrect for class "+name+": "+e); } classCash.put(name,result); return result; }
@Override protected URL findResource(String name) { File f= findFile(name, ""); if(f==null) return null; try { return f.toURL(); }catch(MalformedURLException ex) { return null; } }
private File findFile(String name, String extension) { for(int i=0;i<classPath.size();i++) { File f= new File((new File(classPath.get(i))).getPath()+File.separator+name.replace("/",File.separator)+extension); if(f.exists()) return f; } return null; }
public static byte[] loadFileAsBytes(File file) throws IOException { byte[] result= new byte[(int)file.length()]; FileInputStream f= new FileInputStream(file); try { f.read(result,0,result.length); }finally { try { f.close(); }catch(Exception e) {} } return result; }
public void addClassPath(String path) { classPath.add(path); }
public void removeClassPath(String path) { if(classPath.contains(path)) classPath.remove(path); } }
|
это класс программы:
Код | public class TestModule { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader().getClass().getName()); } }
|
Так вот возвращает всё равно sun.misc.Launcher$AppClassLoader!!!! В чём у меня ошибка???
|