Author: mbenson Date: Sun Sep 8 20:13:56 2013 New Revision: 1520917 URL: http://svn.apache.org/r1520917 Log: refactoring and scoping
Modified: commons/proper/proxy/branches/version-2.0-work/asm4/src/main/java/org/apache/commons/proxy2/asm4/ASM4ProxyFactory.java Modified: commons/proper/proxy/branches/version-2.0-work/asm4/src/main/java/org/apache/commons/proxy2/asm4/ASM4ProxyFactory.java URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/asm4/src/main/java/org/apache/commons/proxy2/asm4/ASM4ProxyFactory.java?rev=1520917&r1=1520916&r2=1520917&view=diff ============================================================================== --- commons/proper/proxy/branches/version-2.0-work/asm4/src/main/java/org/apache/commons/proxy2/asm4/ASM4ProxyFactory.java (original) +++ commons/proper/proxy/branches/version-2.0-work/asm4/src/main/java/org/apache/commons/proxy2/asm4/ASM4ProxyFactory.java Sun Sep 8 20:13:56 2013 @@ -67,7 +67,11 @@ public class ASM4ProxyFactory extends Ab private <T> T createProxy(final ClassLoader classLoader, InvocationHandler invocationHandler, final Class<?>... proxyClasses) { final Class<?> proxyClass = PROXY_CLASS_CACHE.getProxyClass(classLoader, proxyClasses); - return ProxyGenerator.constructProxy(proxyClass, invocationHandler); + final Object instance = Unsafe.allocateInstance(proxyClass); + Unsafe.setValue(ProxyGenerator.getDeclaredField(proxyClass, ProxyGenerator.HANDLER_NAME), instance, invocationHandler); + @SuppressWarnings("unchecked") + final T result = (T) instance; + return result; } private static class ProxyGenerator extends AbstractProxyClassGenerator implements Opcodes @@ -96,15 +100,6 @@ public class ASM4ProxyFactory extends Ab } } - public static <T> T constructProxy(final Class<?> clazz, final java.lang.reflect.InvocationHandler handler) throws IllegalStateException - { - final Object instance = Unsafe.allocateInstance(clazz); - Unsafe.setValue(getDeclaredField(clazz, HANDLER_NAME), instance, handler); - @SuppressWarnings("unchecked") - final T result = (T) instance; - return result; - } - private static Field getDeclaredField(final Class<?> clazz, final String fieldName) { try @@ -118,7 +113,7 @@ public class ASM4ProxyFactory extends Ab } } - public static byte[] generateProxy(final Class<?> classToProxy, final String proxyName, final Method[] methods, final Class<?>... interfaces) throws ProxyFactoryException + private static byte[] generateProxy(final Class<?> classToProxy, final String proxyName, final Method[] methods, final Class<?>... interfaces) throws ProxyFactoryException { final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); @@ -477,7 +472,7 @@ public class ASM4ProxyFactory extends Ab throw new IllegalStateException("Type: " + type.getCanonicalName() + " is not a primitive type"); } - static String getCastType(final Class<?> returnType) + private static String getCastType(final Class<?> returnType) { if (returnType.isPrimitive()) { @@ -576,7 +571,7 @@ public class ASM4ProxyFactory extends Ab mv.visitTypeInsn(ANEWARRAY, type.getCanonicalName().replace('.', '/')); } - static String getMethodSignatureAsString(final Class<?> returnType, final Class<?>[] parameterTypes) + private static String getMethodSignatureAsString(final Class<?> returnType, final Class<?>[] parameterTypes) { final StringBuilder builder = new StringBuilder("("); for (final Class<?> parameterType : parameterTypes) { @@ -634,7 +629,7 @@ public class ASM4ProxyFactory extends Ab throw new IllegalStateException("Type: " + type.getCanonicalName() + " is not a primitive type"); } - public static String getAsmTypeAsString(final Class<?> parameterType, final boolean wrap) + private static String getAsmTypeAsString(final Class<?> parameterType, final boolean wrap) { if (parameterType.isArray()) { @@ -661,179 +656,6 @@ public class ASM4ProxyFactory extends Ab } return className.replace('.', '/'); } - - private static class Unsafe - { - // sun.misc.Unsafe - private static final Object unsafe; - private static final Method defineClass; - private static final Method allocateInstance; - private static final Method putObject; - private static final Method objectFieldOffset; - - static - { - final Class<?> unsafeClass; - try { - unsafeClass = AccessController.doPrivileged(new PrivilegedAction<Class<?>>() - { - @Override - public Class<?> run() - { - try - { - return Thread.currentThread().getContextClassLoader().loadClass("sun.misc.Unsafe"); - } - catch (Exception e) - { - try - { - return ClassLoader.getSystemClassLoader().loadClass("sun.misc.Unsafe"); - } - catch (ClassNotFoundException e1) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe", e); - } - } - } - }); - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe class", e); - } - - unsafe = AccessController.doPrivileged(new PrivilegedAction<Object>() - { - @Override - public Object run() - { - try - { - final Field field = unsafeClass.getDeclaredField("theUnsafe"); - field.setAccessible(true); - return field.get(null); - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe", e); - } - } - }); - allocateInstance = AccessController.doPrivileged(new PrivilegedAction<Method>() - { - @Override - public Method run() - { - try - { - final Method mtd = unsafeClass.getDeclaredMethod("allocateInstance", Class.class); - mtd.setAccessible(true); - return mtd; - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe.allocateInstance", e); - } - } - }); - objectFieldOffset = AccessController.doPrivileged(new PrivilegedAction<Method>() - { - @Override - public Method run() - { - try - { - final Method mtd = unsafeClass.getDeclaredMethod("objectFieldOffset", Field.class); - mtd.setAccessible(true); - return mtd; - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe.objectFieldOffset", e); - } - } - }); - putObject = AccessController.doPrivileged(new PrivilegedAction<Method>() - { - @Override - public Method run() - { - try - { - final Method mtd = unsafeClass.getDeclaredMethod("putObject", Object.class, long.class, Object.class); - mtd.setAccessible(true); - return mtd; - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe.putObject", e); - } - } - }); - defineClass = AccessController.doPrivileged(new PrivilegedAction<Method>() - { - @Override - public Method run() - { - try - { - final Method mtd = unsafeClass.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); - mtd.setAccessible(true); - return mtd; - } - catch (Exception e) - { - throw new IllegalStateException("Cannot get sun.misc.Unsafe.defineClass", e); - } - } - }); - } - - private static Object allocateInstance(final Class<?> clazz) - { - try - { - return allocateInstance.invoke(unsafe, clazz); - } - catch (IllegalAccessException e) - { - throw new IllegalStateException("Failed to allocateInstance of Proxy class " + clazz.getName(), e); - } - catch (InvocationTargetException e) - { - final Throwable throwable = e.getTargetException() != null ? e.getTargetException() : e; - throw new IllegalStateException("Failed to allocateInstance of Proxy class " + clazz.getName(), throwable); - } - } - - private static void setValue(final Field field, final Object object, final Object value) - { - final long offset; - try - { - offset = (Long) objectFieldOffset.invoke(unsafe, field); - } - catch (Exception e) - { - throw new IllegalStateException("Failed getting offset for: field=" + field.getName() + " class=" + field.getDeclaringClass().getName(), e); - } - - try - { - putObject.invoke(unsafe, object, offset, value); - } - catch (Exception e) - { - throw new IllegalStateException("Failed putting field=" + field.getName() + " class=" + field.getDeclaringClass().getName(), e); - } - } - - private static Class<?> defineClass(final ClassLoader loader, final Class<?> clsToProxy, final String proxyName, final byte[] proxyBytes) throws IllegalAccessException, InvocationTargetException - { - return (Class<?>) defineClass.invoke(unsafe, proxyName, proxyBytes, 0, proxyBytes.length, loader, clsToProxy.getProtectionDomain()); - } - } } //////////////// these classes should be protected in ProxyFactory @@ -972,4 +794,177 @@ public class ASM4ProxyFactory extends Ab } } } + + static class Unsafe + { + // sun.misc.Unsafe + private static final Object unsafe; + private static final Method defineClass; + private static final Method allocateInstance; + private static final Method putObject; + private static final Method objectFieldOffset; + + static + { + final Class<?> unsafeClass; + try { + unsafeClass = AccessController.doPrivileged(new PrivilegedAction<Class<?>>() + { + @Override + public Class<?> run() + { + try + { + return Thread.currentThread().getContextClassLoader().loadClass("sun.misc.Unsafe"); + } + catch (Exception e) + { + try + { + return ClassLoader.getSystemClassLoader().loadClass("sun.misc.Unsafe"); + } + catch (ClassNotFoundException e1) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe", e); + } + } + } + }); + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe class", e); + } + + unsafe = AccessController.doPrivileged(new PrivilegedAction<Object>() + { + @Override + public Object run() + { + try + { + final Field field = unsafeClass.getDeclaredField("theUnsafe"); + field.setAccessible(true); + return field.get(null); + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe", e); + } + } + }); + allocateInstance = AccessController.doPrivileged(new PrivilegedAction<Method>() + { + @Override + public Method run() + { + try + { + final Method mtd = unsafeClass.getDeclaredMethod("allocateInstance", Class.class); + mtd.setAccessible(true); + return mtd; + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe.allocateInstance", e); + } + } + }); + objectFieldOffset = AccessController.doPrivileged(new PrivilegedAction<Method>() + { + @Override + public Method run() + { + try + { + final Method mtd = unsafeClass.getDeclaredMethod("objectFieldOffset", Field.class); + mtd.setAccessible(true); + return mtd; + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe.objectFieldOffset", e); + } + } + }); + putObject = AccessController.doPrivileged(new PrivilegedAction<Method>() + { + @Override + public Method run() + { + try + { + final Method mtd = unsafeClass.getDeclaredMethod("putObject", Object.class, long.class, Object.class); + mtd.setAccessible(true); + return mtd; + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe.putObject", e); + } + } + }); + defineClass = AccessController.doPrivileged(new PrivilegedAction<Method>() + { + @Override + public Method run() + { + try + { + final Method mtd = unsafeClass.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); + mtd.setAccessible(true); + return mtd; + } + catch (Exception e) + { + throw new IllegalStateException("Cannot get sun.misc.Unsafe.defineClass", e); + } + } + }); + } + + static Object allocateInstance(final Class<?> clazz) + { + try + { + return allocateInstance.invoke(unsafe, clazz); + } + catch (IllegalAccessException e) + { + throw new IllegalStateException("Failed to allocateInstance of Proxy class " + clazz.getName(), e); + } + catch (InvocationTargetException e) + { + final Throwable throwable = e.getTargetException() != null ? e.getTargetException() : e; + throw new IllegalStateException("Failed to allocateInstance of Proxy class " + clazz.getName(), throwable); + } + } + + static void setValue(final Field field, final Object object, final Object value) + { + final long offset; + try + { + offset = (Long) objectFieldOffset.invoke(unsafe, field); + } + catch (Exception e) + { + throw new IllegalStateException("Failed getting offset for: field=" + field.getName() + " class=" + field.getDeclaringClass().getName(), e); + } + + try + { + putObject.invoke(unsafe, object, offset, value); + } + catch (Exception e) + { + throw new IllegalStateException("Failed putting field=" + field.getName() + " class=" + field.getDeclaringClass().getName(), e); + } + } + + static Class<?> defineClass(final ClassLoader loader, final Class<?> clsToProxy, final String proxyName, final byte[] proxyBytes) throws IllegalAccessException, InvocationTargetException + { + return (Class<?>) defineClass.invoke(unsafe, proxyName, proxyBytes, 0, proxyBytes.length, loader, clsToProxy.getProtectionDomain()); + } + } } \ No newline at end of file