Skip to content

Instantly share code, notes, and snippets.

@pxpc2
Created December 29, 2012 00:23
Show Gist options
  • Save pxpc2/4403390 to your computer and use it in GitHub Desktop.
Save pxpc2/4403390 to your computer and use it in GitHub Desktop.
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