178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * COPYRIGHT & LICENSE 378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * This code is Copyright (c) 2006 BEA Systems, inc. It is provided free, as-is and without any warranties for the purpose of 578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * inclusion in Objenesis or any other open source project with a FSF approved license, as long as this notice is not 678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * removed. There are no limitations on modifying or repackaging the code apart from this. 778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * BEA does not guarantee that the code works, and provides no support for it. Use at your own risk. 978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 1078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Originally developed by Leonardo Mesquita. Copyright notice added by Henrik Ståhl, BEA JRockit Product Manager. 1178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 1278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 1378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 1478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpackage org.objenesis.instantiator.jrockit; 1578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 1678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.lang.reflect.Method; 1778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 1878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisException; 1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.ObjectInstantiator; 2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Instantiates a class by making a call to internal JRockit private methods. It is only supposed to 2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * work on JRockit 1.4.2 JVMs prior to release R25.1. From release R25.1 on, JRockit supports 2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * sun.reflect.ReflectionFactory, making this "trick" unnecessary. This instantiator will not call 2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * any constructors. 2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Leonardo Mesquita 2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @see org.objenesis.instantiator.ObjectInstantiator 2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @see org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator 3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpublic class JRockitLegacyInstantiator implements ObjectInstantiator { 3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson private static Method safeAllocObjectMethod = null; 3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson private static void initialize() { 3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(safeAllocObjectMethod == null) { 3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson Class memSystem; 3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson try { 3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson memSystem = Class.forName("jrockit.vm.MemSystem"); 3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson safeAllocObjectMethod = memSystem.getDeclaredMethod("safeAllocObject", 4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson new Class[] {Class.class}); 4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson safeAllocObjectMethod.setAccessible(true); 4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson catch(RuntimeException e) { 4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson throw new ObjenesisException(e); 4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson catch(ClassNotFoundException e) { 4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson throw new ObjenesisException(e); 4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson catch(NoSuchMethodException e) { 5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson throw new ObjenesisException(e); 5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson private final Class type; 5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson public JRockitLegacyInstantiator(Class type) { 5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson initialize(); 5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson this.type = type; 6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson public Object newInstance() { 6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson try { 6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return safeAllocObjectMethod.invoke(null, new Object[] {type}); 6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson catch(Exception e) { 6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson throw new ObjenesisException(e); 6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson} 71