1 --- src/mockito/java/com/google/dexmaker/mockito/UnsafeAllocator.java 2 +++ src/mockito/java/com/google/dexmaker/mockito/UnsafeAllocator.java 3 @@ -92,6 +92,29 @@ abstract class UnsafeAllocator { 4 } catch (Exception ignored) { 5 } 6 7 + // try dalvikvm, with change https://android-review.googlesource.com/#/c/52331/ 8 + // public class ObjectStreamClass { 9 + // private static native long getConstructorId(Class<?> c); 10 + // private static native Object newInstance(Class<?> instantiationClass, long methodId); 11 + // } 12 + try { 13 + Method getConstructorId = ObjectStreamClass.class 14 + .getDeclaredMethod("getConstructorId", Class.class); 15 + getConstructorId.setAccessible(true); 16 + final long constructorId = (Long) getConstructorId.invoke(null, Object.class); 17 + final Method newInstance = ObjectStreamClass.class 18 + .getDeclaredMethod("newInstance", Class.class, long.class); 19 + newInstance.setAccessible(true); 20 + return new UnsafeAllocator() { 21 + @Override 22 + @SuppressWarnings("unchecked") 23 + public <T> T newInstance(Class<T> c) throws Exception { 24 + return (T) newInstance.invoke(null, c, constructorId); 25 + } 26 + }; 27 + } catch (Exception ignored) { 28 + } 29 + 30 // give up 31 return new UnsafeAllocator() { 32 @Override 33 @@ -100,4 +123,4 @@ abstract class UnsafeAllocator { 34 } 35 }; 36 } 37 -} 38 \ No newline at end of file 39 +} 40