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 Parkinson
1778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpackage org.objenesis.instantiator.sun;
1878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.lang.reflect.Constructor;
1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.lang.reflect.InvocationTargetException;
2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.lang.reflect.Method;
2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisException;
2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.ObjectInstantiator;
2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/**
2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Helper methods providing access to {@link sun.reflect.ReflectionFactory} via reflection, for use
2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * by the {@link ObjectInstantiator}s that use it.
2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Henri Tremblay
3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */
3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonclass SunReflectionFactoryHelper {
3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public static Constructor newConstructorForSerialization(Class type, Constructor constructor) {
3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      Class reflectionFactoryClass = getReflectionFactoryClass();
3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      Object reflectionFactory = createReflectionFactory(reflectionFactoryClass);
3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      Method newConstructorForSerializationMethod = getNewConstructorForSerializationMethod(
3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         reflectionFactoryClass);
4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      try {
4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return (Constructor) newConstructorForSerializationMethod.invoke(
4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson            reflectionFactory, new Object[] {type, constructor});
4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(IllegalArgumentException e) {
4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(IllegalAccessException e) {
4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(InvocationTargetException e) {
5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static Class getReflectionFactoryClass() {
5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      try {
5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return Class.forName("sun.reflect.ReflectionFactory");
5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(ClassNotFoundException e) {
6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static Object createReflectionFactory(Class reflectionFactoryClass) {
6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      try {
6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         Method method = reflectionFactoryClass.getDeclaredMethod(
6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson            "getReflectionFactory", new Class[] {});
6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return method.invoke(null, new Object[] {});
7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(NoSuchMethodException e) {
7278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
7378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(IllegalAccessException e) {
7578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
7678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(IllegalArgumentException e) {
7878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
7978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
8078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(InvocationTargetException e) {
8178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
8278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
8378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
8478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
8578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static Method getNewConstructorForSerializationMethod(Class reflectionFactoryClass) {
8678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      try {
8778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return reflectionFactoryClass.getDeclaredMethod(
8878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson            "newConstructorForSerialization", new Class[] {Class.class, Constructor.class});
8978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
9078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(NoSuchMethodException e) {
9178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         throw new ObjenesisException(e);
9278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
9378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
9478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson}
95