Created
December 29, 2012 00:23
-
-
Save pxpc2/4403390 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package us.brtm.brbot.core.customclasses; | |
import java.util.HashMap; | |
import java.util.Map; | |
/** | |
* brBot is an open software: you can use it | |
* for any purpose that is under the terms of | |
* the GNU General Public License, either version | |
* three (3) or later. | |
* <p/> | |
* see: <LINK>http://www.gnu.org/licenses/</LINK> | |
* | |
* @author pxpc2 | |
*/ | |
public class ClassBuilder extends ClassLoader { | |
// the classes, in form: Class name | [B class representation | |
private Map<String, byte[]> primitiveClasses = | |
null; | |
// the classes, in form: Class name | Class object | |
private Map<String, Class> loadedClasses = | |
new HashMap<>(); | |
/** | |
* @param primitiveMap The primitive classes to transform! | |
*/ | |
public ClassBuilder(HashMap<String, byte[]> primitiveMap) { | |
primitiveClasses = primitiveMap; | |
} | |
/** | |
* @param name Name of the class to check in the map | |
* @return true: class is loaded - false: class is still in primitives | |
*/ | |
public boolean isLoaded(String name) { | |
return loadedClasses.containsKey(name); | |
} | |
/** | |
* @param name Name of the class to load | |
* @return The class instance as Ljava/lang/Class; | |
*/ | |
public Class loadClass(String name) { | |
if (isLoaded(name)) { | |
return loadedClasses.get(name); | |
} | |
byte[] v = primitiveClasses.get(name); | |
Class c = defineClass(name, v, 0, v.length); | |
loadedClasses.put(name, c); | |
return c; | |
} | |
/** | |
* @param className The name of the class | |
* @return the found class as Ljava/lang/Class; | |
*/ | |
public Class<?> findClass(String className) { | |
if (loadedClasses.containsKey(className)) { | |
return loadedClasses.get(className); | |
} | |
if (primitiveClasses.containsKey(className)) { | |
Class<?> res = defineClass(className, primitiveClasses.get(className), 0, | |
primitiveClasses.get(className).length); | |
loadedClasses.put(className, res); | |
return res; | |
} | |
try { | |
return findSystemClass(className); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
try { | |
return super.findClass(className); | |
} catch (ClassNotFoundException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment