178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Copyright 2006-2013 the original author or authors. 378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Licensed under the Apache License, Version 2.0 (the "License"); 578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * you may not use this file except in compliance with the License. 678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * You may obtain a copy of the License at 778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * http://www.apache.org/licenses/LICENSE-2.0 978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 1078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Unless required by applicable law or agreed to in writing, software 1178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * distributed under the License is distributed on an "AS IS" BASIS, 1278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * See the License for the specific language governing permissions and 1478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * limitations under the License. 1578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 1678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpackage org.objenesis.strategy; 1778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 1878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.ObjectInstantiator; 1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.android.AndroidInstantiator; 2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.gcj.GCJInstantiator; 2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.jrockit.JRockit131Instantiator; 2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.jrockit.JRockitLegacyInstantiator; 2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.perc.PercInstantiator; 2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.sun.Sun13Instantiator; 2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator; 2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Guess the best instantiator for a given class. The instantiator will instantiate the class 2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * without calling any constructor. Currently, the selection doesn't depend on the class. It relies 3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * on the 3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <ul> 3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM version</li> 3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM vendor</li> 3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM vendor version</li> 3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * </ul> 3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * However, instantiators are stateful and so dedicated to their class. 3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Henri Tremblay 3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @see ObjectInstantiator 4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpublic class StdInstantiatorStrategy extends BaseInstantiatorStrategy { 4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson /** 4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Return an {@link ObjectInstantiator} allowing to create instance without any constructor being 4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * called. 4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @param type Class to instantiate 4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @return The ObjectInstantiator for the class 4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson public ObjectInstantiator newInstantiatorOf(Class type) { 5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(JVM_NAME.startsWith(SUN)) { 5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(VM_VERSION.startsWith("1.3")) { 5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new Sun13Instantiator(type); 5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(JROCKIT)) { 5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(VM_VERSION.startsWith("1.3")) { 5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new JRockit131Instantiator(type); 6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(VM_VERSION.startsWith("1.4")) { 6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // JRockit vendor version will be RXX where XX is the version 6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // Versions prior to 26 need special handling 6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // From R26 on, java.vm.version starts with R 6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(!VENDOR_VERSION.startsWith("R")) { 6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // On R25.1 and R25.2, ReflectionFactory should work. Otherwise, we must use the 6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // Legacy instantiator. 6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(VM_INFO == null || !VM_INFO.startsWith("R25.1") || !VM_INFO.startsWith("R25.2")) { 6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new JRockitLegacyInstantiator(type); 7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(DALVIK)) { 7578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new AndroidInstantiator(type); 7678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(GNU)) { 7878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new GCJInstantiator(type); 7978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 8078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(PERC)) { 8178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new PercInstantiator(type); 8278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 8378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 8478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // Fallback instantiator, should work with: 8578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // - Java Hotspot version 1.4 and higher 8678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // - JRockit 1.4-R26 and higher 8778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // - IBM and Hitachi JVMs 8878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson // ... might works for others so we just give it a try 8978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new SunReflectionFactoryInstantiator(type); 9078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 9178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson} 92