diff -Nru reflectasm-1.07/src/com/esotericsoftware/reflectasm/AccessClassLoader.java reflectasm-1.07-trunk/src/com/esotericsoftware/reflectasm/AccessClassLoader.java --- reflectasm-1.07/src/com/esotericsoftware/reflectasm/AccessClassLoader.java 2013-07-03 22:39:00.000000000 +0200 +++ reflectasm-1.07-trunk/src/com/esotericsoftware/reflectasm/AccessClassLoader.java 2013-10-09 12:25:47.000000000 +0200 @@ -2,6 +2,7 @@ package com.esotericsoftware.reflectasm; import java.lang.reflect.Method; +import java.security.ProtectionDomain; import java.util.ArrayList; class AccessClassLoader extends ClassLoader { @@ -14,12 +15,22 @@ AccessClassLoader accessClassLoader = accessClassLoaders.get(i); if (accessClassLoader.getParent() == parent) return accessClassLoader; } + if(parent == null) parent = ClassLoader.getSystemClassLoader(); AccessClassLoader accessClassLoader = new AccessClassLoader(parent); accessClassLoaders.add(accessClassLoader); return accessClassLoader; } } + static void remove (ClassLoader parent) { + synchronized (accessClassLoaders) { + for (int i = accessClassLoaders.size() - 1; i >= 0; i--) { + AccessClassLoader accessClassLoader = accessClassLoaders.get(i); + if (accessClassLoader.getParent() == parent) accessClassLoaders.remove(i); + } + } + } + private AccessClassLoader (ClassLoader parent) { super(parent); } @@ -37,11 +48,12 @@ try { // Attempt to load the access class in the same loader, which makes protected and default access members accessible. Method method = ClassLoader.class.getDeclaredMethod("defineClass", new Class[] {String.class, byte[].class, int.class, - int.class}); + int.class, ProtectionDomain.class}); method.setAccessible(true); - return (Class)method.invoke(getParent(), new Object[] {name, bytes, Integer.valueOf(0), Integer.valueOf(bytes.length)}); + return (Class)method.invoke(getParent(), new Object[] {name, bytes, Integer.valueOf(0), Integer.valueOf(bytes.length), + getClass().getProtectionDomain()}); } catch (Exception ignored) { } - return defineClass(name, bytes, 0, bytes.length); + return defineClass(name, bytes, 0, bytes.length, getClass().getProtectionDomain()); } }