001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.common; 014 015import java.io.File; 016import java.net.MalformedURLException; 017import java.net.URISyntaxException; 018import java.net.URL; 019import java.net.URLClassLoader; 020import java.util.List; 021import java.util.logging.Level; 022 023import com.google.common.collect.ImmutableList; 024 025import cpw.mods.fml.common.asm.ASMTransformer; 026import cpw.mods.fml.common.asm.transformers.AccessTransformer; 027import cpw.mods.fml.common.modloader.BaseModProxy; 028import cpw.mods.fml.relauncher.RelaunchClassLoader; 029 030/** 031 * A simple delegating class loader used to load mods into the system 032 * 033 * 034 * @author cpw 035 * 036 */ 037public class ModClassLoader extends URLClassLoader 038{ 039 private static final List<String> STANDARD_LIBRARIES = ImmutableList.of("jinput.jar", "lwjgl.jar", "lwjgl_util.jar"); 040 private RelaunchClassLoader mainClassLoader; 041 042 public ModClassLoader(ClassLoader parent) { 043 super(new URL[0], null); 044 this.mainClassLoader = (RelaunchClassLoader)parent; 045 } 046 047 public void addFile(File modFile) throws MalformedURLException 048 { 049 URL url = modFile.toURI().toURL(); 050 mainClassLoader.addURL(url); 051 } 052 053 @Override 054 public Class<?> loadClass(String name) throws ClassNotFoundException 055 { 056 return mainClassLoader.loadClass(name); 057 } 058 059 public File[] getParentSources() { 060 List<URL> urls=mainClassLoader.getSources(); 061 File[] sources=new File[urls.size()]; 062 try 063 { 064 for (int i = 0; i<urls.size(); i++) 065 { 066 sources[i]=new File(urls.get(i).toURI()); 067 } 068 return sources; 069 } 070 catch (URISyntaxException e) 071 { 072 FMLLog.log(Level.SEVERE, e, "Unable to process our input to locate the minecraft code"); 073 throw new LoaderException(e); 074 } 075 } 076 077 public List<String> getDefaultLibraries() 078 { 079 return STANDARD_LIBRARIES; 080 } 081 082 public Class<? extends BaseModProxy> loadBaseModClass(String modClazzName) throws Exception 083 { 084 AccessTransformer transformer = (AccessTransformer)mainClassLoader.getTransformers().get(0); 085 transformer.ensurePublicAccessFor(modClazzName); 086 return (Class<? extends BaseModProxy>) Class.forName(modClazzName, true, this); 087 } 088}