package org.nutz.lang.reflect; import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.ProtectionDomain; @SuppressWarnings({"unchecked", "rawtypes"}) public class ReflectTool { private static Method DEFINE_CLASS; private static final ProtectionDomain PROTECTION_DOMAIN; static { PROTECTION_DOMAIN = getProtectionDomain(ReflectTool.class); AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { Class loader = Class.forName("java.lang.ClassLoader"); // JVM // crash // w/o // this DEFINE_CLASS = loader.getDeclaredMethod("defineClass", new Class[]{String.class, byte[].class, Integer.TYPE, Integer.TYPE, ProtectionDomain.class}); DEFINE_CLASS.setAccessible(true); } catch (ClassNotFoundException e) { // Lang.impossible(); } catch (NoSuchMethodException e) { // Lang.impossible(); } return null; } }); } public static ProtectionDomain getProtectionDomain(final Class source) { if (source == null) { return null; } return (ProtectionDomain) AccessController.doPrivileged(new PrivilegedAction() { public Object run() { return source.getProtectionDomain(); } }); } public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception { return defineClass(className, b, loader, PROTECTION_DOMAIN); } public static Class defineClass(String className, byte[] b, ClassLoader loader, ProtectionDomain protectionDomain) throws Exception { Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), protectionDomain}; if (loader == null) loader = ReflectTool.class.getClassLoader(); Class c = (Class) DEFINE_CLASS.invoke(loader, args); // Force static initializers to run. Class.forName(className, true, loader); return c; } }