//# 4 errors, 342 messages
//#
/*
    //#PluginClassLoader.java:1:1: class: com.dmdirc.plugins.PluginClassLoader
    //#PluginClassLoader.java:1:1: method: com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.plugins;

import com.dmdirc.util.resourcemanager.ResourceManager;

import java.io.IOException;

public class PluginClassLoader extends ClassLoader {
	/** The plugin Info object for the plugin we are loading. */
	final PluginInfo pluginInfo;
	
	/**
	 * Create a new PluginClassLoader.
	 *
	 * @param info PluginInfo this classloader will be for
	 */
	public PluginClassLoader(final PluginInfo info) {
		super();
    //#PluginClassLoader.java:39: method: void com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader(PluginInfo)
    //#input(void com.dmdirc.plugins.PluginClassLoader(PluginInfo)): info
    //#input(void com.dmdirc.plugins.PluginClassLoader(PluginInfo)): this
    //#output(void com.dmdirc.plugins.PluginClassLoader(PluginInfo)): this.pluginInfo
    //#post(void com.dmdirc.plugins.PluginClassLoader(PluginInfo)): this.pluginInfo == info
    //#post(void com.dmdirc.plugins.PluginClassLoader(PluginInfo)): init'ed(this.pluginInfo)
		pluginInfo = info;
	}
    //#PluginClassLoader.java:41: end of method: void com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader(PluginInfo)
	
	/**
	 * Create a new PluginClassLoader.
	 *
	 * @param info PluginInfo this classloader will be for
	 * @param parent Parent ClassLoader
	 */
	private PluginClassLoader(final PluginInfo info, final PluginClassLoader parent) {
		super(parent);
    //#PluginClassLoader.java:50: method: void com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)
    //#input(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): info
    //#input(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): parent
    //#input(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): this
    //#output(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): this.pluginInfo
    //#post(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): this.pluginInfo == info
    //#post(void com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)): init'ed(this.pluginInfo)
		pluginInfo = info;
	}
    //#PluginClassLoader.java:52: end of method: void com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader(PluginInfo, PluginClassLoader)
	
	/**
	 * Get a PluginClassLoader that is a subclassloader of this one.
	 *
     * @param info PluginInfo the new classloader will be for
     * @return A classloader configured with this one as its parent
	 */
	public PluginClassLoader getSubClassLoader(final PluginInfo info) {
		return (new PluginClassLoader(info, this));
    //#PluginClassLoader.java:61: method: PluginClassLoader com.dmdirc.plugins.PluginClassLoader.getSubClassLoader(PluginInfo)
    //#input(PluginClassLoader getSubClassLoader(PluginInfo)): info
    //#input(PluginClassLoader getSubClassLoader(PluginInfo)): this
    //#output(PluginClassLoader getSubClassLoader(PluginInfo)): new PluginClassLoader(getSubClassLoader#1) num objects
    //#output(PluginClassLoader getSubClassLoader(PluginInfo)): return_value.__Tag
    //#output(PluginClassLoader getSubClassLoader(PluginInfo)): return_value.pluginInfo
    //#output(PluginClassLoader getSubClassLoader(PluginInfo)): return_value
    //#new obj(PluginClassLoader getSubClassLoader(PluginInfo)): new PluginClassLoader(getSubClassLoader#1)
    //#post(PluginClassLoader getSubClassLoader(PluginInfo)): return_value == &new PluginClassLoader(getSubClassLoader#1)
    //#post(PluginClassLoader getSubClassLoader(PluginInfo)): new PluginClassLoader(getSubClassLoader#1) num objects == 1
    //#post(PluginClassLoader getSubClassLoader(PluginInfo)): return_value.__Tag == com/dmdirc/plugins/PluginClassLoader
    //#post(PluginClassLoader getSubClassLoader(PluginInfo)): return_value.pluginInfo == info
    //#post(PluginClassLoader getSubClassLoader(PluginInfo)): init'ed(return_value.pluginInfo)
    //#unanalyzed(PluginClassLoader getSubClassLoader(PluginInfo)): Effects-of-calling:java.lang.ClassLoader
    //#PluginClassLoader.java:61: end of method: PluginClassLoader com.dmdirc.plugins.PluginClassLoader.getSubClassLoader(PluginInfo)
	}
	
	/**
	 * Load the plugin with the given className
	 *
	 * @param name Class Name of plugin
	 * @return plugin class
	 * @throws ClassNotFoundException if the class to be loaded could not be found.
	 */
    @Override
	public Class<?> loadClass(final String name) throws ClassNotFoundException {
		return loadClass(name, true);
    //#PluginClassLoader.java:73: method: Class com.dmdirc.plugins.PluginClassLoader.loadClass(String)
    //#input(Class loadClass(String)): ""._tainted
    //#input(Class loadClass(String)): "' (wanted by "._tainted
    //#input(Class loadClass(String)): ") -> "._tainted
    //#input(Class loadClass(String)): ") does not exist."._tainted
    //#input(Class loadClass(String)): "-resourcemanagerTimer"._tainted
    //#input(Class loadClass(String)): ".class"._tainted
    //#input(Class loadClass(String)): "Could not load "._tainted
    //#input(Class loadClass(String)): "Error loading '"._tainted
    //#input(Class loadClass(String)): "Resource '"._tainted
    //#input(Class loadClass(String)): "jar:.."._tainted
    //#input(Class loadClass(String)): __Descendant_Table[com/dmdirc/plugins/PluginClassLoader]
    //#input(Class loadClass(String)): __Descendant_Table[others]
    //#input(Class loadClass(String)): __Dispatch_Table.isClassLoaded(Ljava/lang/String;Z)Z
    //#input(Class loadClass(String)): __Dispatch_Table.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
    //#input(Class loadClass(String)): com/dmdirc/plugins/GlobalClassLoader.__Class_Obj.__Lock
    //#input(Class loadClass(String)): com/dmdirc/plugins/GlobalClassLoader.me
    //#input(Class loadClass(String)): com/dmdirc/plugins/GlobalClassLoader.me.resourcesList
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Descendant_Table[com/dmdirc/plugins/PluginInfo]
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Descendant_Table[others]
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getClassList()Ljava/util/List;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getFullFilename()Ljava/lang/String;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getKeyValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPersistentClasses()Ljava/util/List;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPluginClassLoader()Lcom/dmdirc/plugins/PluginClassLoader;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager()Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager(Z)Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent()Z
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent(Ljava/lang/String;)Z
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginManager.__Descendant_Table[com/dmdirc/plugins/PluginManager]
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginManager.__Descendant_Table[others]
    //#input(Class loadClass(String)): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getPluginInfos()Ljava/util/Collection;
    //#input(Class loadClass(String)): name
    //#input(Class loadClass(String)): name._tainted
    //#input(Class loadClass(String)): this
    //#input(Class loadClass(String)): this.__Tag
    //#input(Class loadClass(String)): this.pluginInfo
    //#input(Class loadClass(String)): this.pluginInfo.__Tag
    //#input(Class loadClass(String)): this.pluginInfo.filename
    //#input(Class loadClass(String)): this.pluginInfo.filename._tainted
    //#input(Class loadClass(String)): this.pluginInfo.metaData
    //#input(Class loadClass(String)): this.pluginInfo.myResourceManager
    //#input(Class loadClass(String)): this.pluginInfo.url
    //#output(Class loadClass(String)): com/dmdirc/plugins/GlobalClassLoader.me
    //#output(Class loadClass(String)): new GlobalClassLoader(getGlobalClassLoader#1) num objects
    //#output(Class loadClass(String)): new GlobalClassLoader(getGlobalClassLoader#1).__Tag
    //#output(Class loadClass(String)): new GlobalClassLoader(getGlobalClassLoader#1).resourcesList
    //#output(Class loadClass(String)): new HashMap(GlobalClassLoader#1) num objects
    //#output(Class loadClass(String)): return_value
    //#output(Class loadClass(String)): this.pluginInfo.myResourceManager
    //#new obj(Class loadClass(String)): new GlobalClassLoader(getGlobalClassLoader#1)
    //#new obj(Class loadClass(String)): new HashMap(GlobalClassLoader#1)
    //#pre[1] (Class loadClass(String)): (soft) com/dmdirc/plugins/GlobalClassLoader.me.resourcesList != null
    //#pre[2] (Class loadClass(String)): (soft) name != null
    //#pre[4] (Class loadClass(String)): (soft) com/dmdirc/plugins/GlobalClassLoader.me != null
    //#pre[5] (Class loadClass(String)): (soft) init'ed(this.pluginInfo.myResourceManager)
    //#pre[7] (Class loadClass(String)): (soft) this.__Tag == com/dmdirc/plugins/PluginClassLoader
    //#pre[8] (Class loadClass(String)): (soft) this.pluginInfo != null
    //#pre[10] (Class loadClass(String)): (soft) this.pluginInfo.__Tag == com/dmdirc/plugins/PluginInfo
    //#pre[13] (Class loadClass(String)): (soft) init'ed(this.pluginInfo.metaData)
    //#pre[14] (Class loadClass(String)): (soft) this.pluginInfo.url != null
    //#post(Class loadClass(String)): init'ed(com/dmdirc/plugins/GlobalClassLoader.me)
    //#post(Class loadClass(String)): init'ed(return_value)
    //#post(Class loadClass(String)): init'ed(this.pluginInfo.myResourceManager)
    //#post(Class loadClass(String)): new GlobalClassLoader(getGlobalClassLoader#1) num objects == 0
    //#post(Class loadClass(String)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).__Tag)
    //#post(Class loadClass(String)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).resourcesList)
    //#post(Class loadClass(String)): new HashMap(GlobalClassLoader#1) num objects == 0
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:findLoadedClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.ClassLoader
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:findLoadedClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:getParent
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:loadClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getResourceManager
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.String:replace
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:isPersistent
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:resourceExists
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:defineClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.ClassLoader:loadClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getPluginManager
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getPluginInfos
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getClassList
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getPluginClassLoader
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getPersistentClasses
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getFullFilename
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:getName
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.NoClassDefFoundError:getMessage
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.ClassNotFoundException
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:defineClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:resolveClass
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.net.URL:getPath
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Timer
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isFlatDomain
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getFlatDomain
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWith
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:java.lang.String:replaceAll
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(Class loadClass(String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#PluginClassLoader.java:73: end of method: Class com.dmdirc.plugins.PluginClassLoader.loadClass(String)
	}
	
	/**
	 * Have we already loaded the given class name?
	 *
	 * @param name Name to check.
     * @param checkGlobal Should we check if the GCL has loaded it aswell?
     * @return True if the specified class is loaded, false otherwise
	 */
	public boolean isClassLoaded(final String name, final boolean checkGlobal) {
		// Don't duplicate a class
		final Class existing = findLoadedClass(name);
    //#PluginClassLoader.java:85: method: bool com.dmdirc.plugins.PluginClassLoader.isClassLoaded(String, bool)
    //#PluginClassLoader.java:85: Warning: method not available - call not analyzed
    //#    call on Class com.dmdirc.plugins.PluginClassLoader:findLoadedClass(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: bool isClassLoaded(String, bool)
    //#    unanalyzed callee: Class com.dmdirc.plugins.PluginClassLoader:findLoadedClass(String)
    //#input(bool isClassLoaded(String, bool)): checkGlobal
    //#input(bool isClassLoaded(String, bool)): com/dmdirc/plugins/GlobalClassLoader.__Class_Obj.__Lock
    //#input(bool isClassLoaded(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me
    //#input(bool isClassLoaded(String, bool)): name
    //#input(bool isClassLoaded(String, bool)): this
    //#output(bool isClassLoaded(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me
    //#output(bool isClassLoaded(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1) num objects
    //#output(bool isClassLoaded(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1).__Tag
    //#output(bool isClassLoaded(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1).resourcesList
    //#output(bool isClassLoaded(String, bool)): new HashMap(GlobalClassLoader#1) num objects
    //#output(bool isClassLoaded(String, bool)): return_value
    //#new obj(bool isClassLoaded(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1)
    //#new obj(bool isClassLoaded(String, bool)): new HashMap(GlobalClassLoader#1)
    //#pre[3] (bool isClassLoaded(String, bool)): (soft) init'ed(com/dmdirc/plugins/GlobalClassLoader.me)
    //#post(bool isClassLoaded(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me == One-of{old com/dmdirc/plugins/GlobalClassLoader.me, &new GlobalClassLoader(getGlobalClassLoader#1)}
    //#post(bool isClassLoaded(String, bool)): init'ed(com/dmdirc/plugins/GlobalClassLoader.me)
    //#post(bool isClassLoaded(String, bool)): init'ed(return_value)
    //#post(bool isClassLoaded(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1) num objects <= 1
    //#post(bool isClassLoaded(String, bool)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).__Tag)
    //#post(bool isClassLoaded(String, bool)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).resourcesList)
    //#post(bool isClassLoaded(String, bool)): new HashMap(GlobalClassLoader#1) num objects <= 1
    //#unanalyzed(bool isClassLoaded(String, bool)): Effects-of-calling:java.lang.ClassLoader
    //#unanalyzed(bool isClassLoaded(String, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(bool isClassLoaded(String, bool)): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:findLoadedClass
		final boolean gcl = (checkGlobal) ? GlobalClassLoader.getGlobalClassLoader().isClassLoaded(name) : false;
		return (existing != null || gcl);
    //#PluginClassLoader.java:87: end of method: bool com.dmdirc.plugins.PluginClassLoader.isClassLoaded(String, bool)
	}
	
	/**
	 * Load the plugin with the given className
	 *
	 * @param name Class Name of plugin
	 * @param askGlobal Ask the gobal class loaded for this class if we can't find it?
	 * @return plugin class
	 * @throws ClassNotFoundException if the class to be loaded could not be found.
	 */
    @Override
	public Class<?> loadClass(final String name, final boolean askGlobal) throws ClassNotFoundException {
		Class< ? > loadedClass = null;
    //#PluginClassLoader.java:100: method: Class com.dmdirc.plugins.PluginClassLoader.loadClass(String, bool)
    //#input(Class loadClass(String, bool)): ""._tainted
    //#input(Class loadClass(String, bool)): "' (wanted by "._tainted
    //#input(Class loadClass(String, bool)): ") -> "._tainted
    //#input(Class loadClass(String, bool)): ") does not exist."._tainted
    //#input(Class loadClass(String, bool)): "-resourcemanagerTimer"._tainted
    //#input(Class loadClass(String, bool)): ".class"._tainted
    //#input(Class loadClass(String, bool)): "Could not load "._tainted
    //#input(Class loadClass(String, bool)): "Error loading '"._tainted
    //#input(Class loadClass(String, bool)): "Resource '"._tainted
    //#input(Class loadClass(String, bool)): "jar:.."._tainted
    //#input(Class loadClass(String, bool)): __Descendant_Table[com/dmdirc/plugins/PluginClassLoader]
    //#input(Class loadClass(String, bool)): __Descendant_Table[others]
    //#input(Class loadClass(String, bool)): __Dispatch_Table.isClassLoaded(Ljava/lang/String;Z)Z
    //#input(Class loadClass(String, bool)): __Dispatch_Table.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
    //#input(Class loadClass(String, bool)): askGlobal
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/GlobalClassLoader.__Class_Obj.__Lock
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me.resourcesList
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Descendant_Table[com/dmdirc/plugins/PluginInfo]
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Descendant_Table[others]
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getClassList()Ljava/util/List;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getFullFilename()Ljava/lang/String;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getKeyValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPersistentClasses()Ljava/util/List;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPluginClassLoader()Lcom/dmdirc/plugins/PluginClassLoader;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager()Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager(Z)Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent()Z
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent(Ljava/lang/String;)Z
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginManager.__Descendant_Table[com/dmdirc/plugins/PluginManager]
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginManager.__Descendant_Table[others]
    //#input(Class loadClass(String, bool)): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getPluginInfos()Ljava/util/Collection;
    //#input(Class loadClass(String, bool)): name
    //#input(Class loadClass(String, bool)): name._tainted
    //#input(Class loadClass(String, bool)): this
    //#input(Class loadClass(String, bool)): this.__Tag
    //#input(Class loadClass(String, bool)): this.pluginInfo
    //#input(Class loadClass(String, bool)): this.pluginInfo.__Tag
    //#input(Class loadClass(String, bool)): this.pluginInfo.filename
    //#input(Class loadClass(String, bool)): this.pluginInfo.filename._tainted
    //#input(Class loadClass(String, bool)): this.pluginInfo.metaData
    //#input(Class loadClass(String, bool)): this.pluginInfo.myResourceManager
    //#input(Class loadClass(String, bool)): this.pluginInfo.url
    //#output(Class loadClass(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me
    //#output(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1) num objects
    //#output(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1).__Tag
    //#output(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1).resourcesList
    //#output(Class loadClass(String, bool)): new HashMap(GlobalClassLoader#1) num objects
    //#output(Class loadClass(String, bool)): return_value
    //#output(Class loadClass(String, bool)): this.pluginInfo.myResourceManager
    //#new obj(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1)
    //#new obj(Class loadClass(String, bool)): new HashMap(GlobalClassLoader#1)
    //#pre[2] (Class loadClass(String, bool)): (soft) com/dmdirc/plugins/GlobalClassLoader.me.resourcesList != null
    //#pre[3] (Class loadClass(String, bool)): (soft) name != null
    //#pre[5] (Class loadClass(String, bool)): (soft) com/dmdirc/plugins/GlobalClassLoader.me != null
    //#pre[6] (Class loadClass(String, bool)): (soft) init'ed(this.pluginInfo.myResourceManager)
    //#pre[8] (Class loadClass(String, bool)): (soft) this.__Tag == com/dmdirc/plugins/PluginClassLoader
    //#pre[9] (Class loadClass(String, bool)): (soft) this.pluginInfo != null
    //#pre[11] (Class loadClass(String, bool)): (soft) this.pluginInfo.__Tag == com/dmdirc/plugins/PluginInfo
    //#pre[14] (Class loadClass(String, bool)): (soft) init'ed(this.pluginInfo.metaData)
    //#pre[15] (Class loadClass(String, bool)): (soft) this.pluginInfo.url != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:defineClass(...)@156 != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:getParent(...).__Tag@103 == com/dmdirc/plugins/PluginClassLoader
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:getParent(...).pluginInfo.__Tag@103 == com/dmdirc/plugins/PluginInfo
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:getParent(...).pluginInfo.url@103 != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:getParent(...).pluginInfo@103 != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.plugins.PluginClassLoader:getParent(...)@103 != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes(...)@147 != null
    //#presumption(Class loadClass(String, bool)): com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(...)@146 == 1
    //#presumption(Class loadClass(String, bool)): com/dmdirc/plugins/GlobalClassLoader.me.resourcesList@103 != null
    //#presumption(Class loadClass(String, bool)): data.length@147 <= 4_294_967_295
    //#post(Class loadClass(String, bool)): init'ed(com/dmdirc/plugins/GlobalClassLoader.me)
    //#post(Class loadClass(String, bool)): init'ed(return_value)
    //#post(Class loadClass(String, bool)): init'ed(this.pluginInfo.myResourceManager)
    //#post(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1) num objects <= 1
    //#post(Class loadClass(String, bool)): new GlobalClassLoader(getGlobalClassLoader#1) num objects == 0
    //#post(Class loadClass(String, bool)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).__Tag)
    //#post(Class loadClass(String, bool)): possibly_updated(new GlobalClassLoader(getGlobalClassLoader#1).__Tag)
    //#post(Class loadClass(String, bool)): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).resourcesList)
    //#post(Class loadClass(String, bool)): possibly_updated(new GlobalClassLoader(getGlobalClassLoader#1).resourcesList)
    //#post(Class loadClass(String, bool)): new HashMap(GlobalClassLoader#1) num objects <= 1
    //#post(Class loadClass(String, bool)): new HashMap(GlobalClassLoader#1) num objects == 0
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:findLoadedClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.ClassLoader
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:findLoadedClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:getParent
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:loadClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getResourceManager
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.String:replace
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:isPersistent
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:resourceExists
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:defineClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.ClassLoader:loadClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getPluginManager
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getPluginInfos
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getClassList
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getPluginClassLoader
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getPersistentClasses
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getFullFilename
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:getName
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.NoClassDefFoundError:getMessage
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.ClassNotFoundException
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:defineClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:resolveClass
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.net.URL:getPath
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Timer
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isFlatDomain
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getFlatDomain
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWith
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:java.lang.String:replaceAll
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(Class loadClass(String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#test_vector(Class loadClass(String, bool)): askGlobal: {0}, {1}
    //#test_vector(Class loadClass(String, bool)): com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(...)@121: {1}, {0}
		if (getParent() instanceof PluginClassLoader) {
    //#PluginClassLoader.java:101: Warning: method not available - call not analyzed
    //#    call on ClassLoader com.dmdirc.plugins.PluginClassLoader:getParent()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: ClassLoader com.dmdirc.plugins.PluginClassLoader:getParent()
			try {
				loadedClass = ((PluginClassLoader)getParent()).loadClass(name, false);
    //#PluginClassLoader.java:103: Warning: method not available - call not analyzed
    //#    call on ClassLoader com.dmdirc.plugins.PluginClassLoader:getParent()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: ClassLoader com.dmdirc.plugins.PluginClassLoader:getParent()
				if (loadedClass != null) {
					return loadedClass;
				}
			} catch (ClassNotFoundException cnfe) {
				/* Parent doesn't have the class, load ourself */
			}
		}
		
		ResourceManager res;
		try {
			res = pluginInfo.getResourceManager();
		} catch (IOException ioe) {
			throw new ClassNotFoundException("Error with resourcemanager", ioe);
		}
	
		final String fileName = name.replace('.', '/')+".class";
		try {
			if (pluginInfo.isPersistent(name) || !res.resourceExists(fileName)) {
    //#PluginClassLoader.java:121: ?null dereference
    //#    res != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    basic block: bb_12
    //#    assertion: res != null
    //#    VN: getResourceManager(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#PluginClassLoader.java:121: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: bool com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(String)
				if (!pluginInfo.isPersistent(name) && askGlobal) {
					return GlobalClassLoader.getGlobalClassLoader().loadClass(name);
    //#PluginClassLoader.java:123: Warning: call too complex - analysis skipped
    //#    call on Class loadClass(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: Class loadClass(String)
				} else {
					// Try to load class from previous load.
					try {
						if (askGlobal) {
							return GlobalClassLoader.getGlobalClassLoader().loadClass(name, pluginInfo);
    //#PluginClassLoader.java:128: ?precondition failure
    //#    com/dmdirc/plugins/GlobalClassLoader.loadClass: (soft) this.resourcesList != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    basic block: bb_18
    //#    assertion: (soft) getGlobalClassLoader(...).resourcesList != null
    //#    callee: Class com/dmdirc/plugins/GlobalClassLoader.loadClass(String, PluginInfo)
    //#    callee assertion: (soft) this.resourcesList != null
    //#    callee file: GlobalClassLoader.java
    //#    callee precondition index: [11]
    //#    callee srcpos: 84
    //#    VN: getGlobalClassLoader(...).resourcesList
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
						}
					} catch (ClassNotFoundException e) {
						/* Class doesn't exist, we load it ourself below */
					}
				}
			}
		} catch (NoClassDefFoundError e) {
			throw new ClassNotFoundException("Error loading '"+name+"' (wanted by "+pluginInfo.getName()+") -> "+e.getMessage(), e);
		}
		
		
		// Don't duplicate a class
		if (isClassLoaded(name, false)) { return findLoadedClass(name); }
    //#PluginClassLoader.java:141: Warning: method not available - call not analyzed
    //#    call on Class com.dmdirc.plugins.PluginClassLoader:findLoadedClass(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: Class com.dmdirc.plugins.PluginClassLoader:findLoadedClass(String)
		
		// We are ment to be loading this one!
		byte[] data = null;
    //#PluginClassLoader.java:144: Warning: unused assignment
    //#    Unused assignment into data
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    Attribs:  Uncertain
		
		if (res.resourceExists(fileName)) {
    //#PluginClassLoader.java:146: ?null dereference
    //#    res != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    basic block: bb_26
    //#    assertion: res != null
    //#    VN: getResourceManager(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#PluginClassLoader.java:146: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: bool com.dmdirc.util.resourcemanager.ResourceManager:resourceExists(String)
			data = res.getResourceBytes(fileName);
    //#PluginClassLoader.java:147: Warning: method not available - call not analyzed
    //#    call on byte[] com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: byte[] com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes(String)
		} else {
			throw new ClassNotFoundException("Resource '"+name+"' (wanted by "+pluginInfo.getName()+") does not exist.");
		}
		
		try {
			if (pluginInfo.isPersistent(name)) {
				GlobalClassLoader.getGlobalClassLoader().defineClass(name, data);
			} else {
				loadedClass = defineClass(name, data, 0, data.length);
    //#PluginClassLoader.java:156: Warning: method not available - call not analyzed
    //#    call on Class com.dmdirc.plugins.PluginClassLoader:defineClass(String, byte[], int, int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: Class com.dmdirc.plugins.PluginClassLoader:defineClass(String, byte[], int, int)
			}
		} catch (NoClassDefFoundError e) {
			throw new ClassNotFoundException(e.getMessage(), e);
		}
		
		if (loadedClass == null) {
			throw new ClassNotFoundException("Could not load " + name);
    //#PluginClassLoader.java:163: ?conditional throw
    //#    loadedClass != null
    //#    severity: LOW
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    basic block: bb_35
    //#    assertion: loadedClass != null
    //#    VN: loadedClass == null
    //#    Expected: {0}
    //#    Bad: {1}
    //#    Attribs:  Int  Exp in +/-1000  Exp singleton  Bad singleton  Bad overlaps +/-1000  Bad > Exp
		} else {
			resolveClass(loadedClass);
    //#PluginClassLoader.java:165: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.plugins.PluginClassLoader:resolveClass(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.plugins.PluginClassLoader
    //#    method: Class loadClass(String, bool)
    //#    unanalyzed callee: void com.dmdirc.plugins.PluginClassLoader:resolveClass(Class)
		}
		
		return loadedClass;
    //#PluginClassLoader.java:168: end of method: Class com.dmdirc.plugins.PluginClassLoader.loadClass(String, bool)
	}
}
    //#output(com.dmdirc.plugins.PluginClassLoader__static_init): __Descendant_Table[com/dmdirc/plugins/PluginClassLoader]
    //#output(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.getSubClassLoader(Lcom/dmdirc/plugins/PluginInfo;)Lcom/dmdirc/plugins/PluginClassLoader;
    //#output(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.isClassLoaded(Ljava/lang/String;Z)Z
    //#output(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.loadClass(Ljava/lang/String;)Ljava/lang/Class;
    //#output(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
    //#post(com.dmdirc.plugins.PluginClassLoader__static_init): __Descendant_Table[com/dmdirc/plugins/PluginClassLoader] == &__Dispatch_Table
    //#post(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.getSubClassLoader(Lcom/dmdirc/plugins/PluginInfo;)Lcom/dmdirc/plugins/PluginClassLoader; == &getSubClassLoader
    //#post(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.isClassLoaded(Ljava/lang/String;Z)Z == &isClassLoaded
    //#post(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.loadClass(Ljava/lang/String;)Ljava/lang/Class; == &loadClass
    //#post(com.dmdirc.plugins.PluginClassLoader__static_init): __Dispatch_Table.loadClass(Ljava/lang/String;Z)Ljava/lang/Class; == &loadClass
    //#PluginClassLoader.java:: end of method: com.dmdirc.plugins.PluginClassLoader.com.dmdirc.plugins.PluginClassLoader__static_init
    //#PluginClassLoader.java:: end of class: com.dmdirc.plugins.PluginClassLoader
