package org.theonefx.wcframework.ioc;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import org.theonefx.wcframework.core.ClassWrapper;
import org.theonefx.wcframework.core.exception.BeanDefinitionStoreException;
import org.theonefx.wcframework.ioc.exception.BeanInstantiationException;
import org.theonefx.wcframework.utils.BeanUtils;
import org.theonefx.wcframework.utils.ReflectionUtils;
import org.theonefx.wcframework.utils.StringUtils;
public class SimpleInstantiationStrategy implements InstantiationStrategy {
@Override
public Object instantiate(ClassWrapper<?> classWrapper, RootBeanDefinition beanDefinition, String beanName) {
Constructor<?> constructorToUse;
synchronized (beanDefinition.constructorArgumentLock) {
constructorToUse = (Constructor<?>) beanDefinition.resolvedConstructorOrFactoryMethod;
if (constructorToUse == null) {
final Class<?> clazz = classWrapper.getWrapperedClass();
if (clazz.isInterface()) {
throw new BeanInstantiationException(clazz, "给定的Class是一个Interface");
}
try {
if (System.getSecurityManager() != null) {
constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>() {
public Constructor<?> run() throws Exception {
return clazz.getDeclaredConstructor((Class[]) null);
}
});
} else {
constructorToUse = clazz.getDeclaredConstructor((Class[]) null);
}
beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse;
} catch (Exception ex) {
throw new BeanInstantiationException(clazz, "没有找到无参构造函数", ex);
}
}
}
return BeanUtils.instantiateClass(constructorToUse);
}
@Override
public Object instantiate(ClassWrapper<?> classWrapper, RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, final Constructor<?> ctor, Object[] args) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
ReflectionUtils.makeAccessible(ctor);
return null;
}
});
}
return BeanUtils.instantiateClass(ctor, args);
}
@Override
public Object instantiate(ClassWrapper<?> classWrapper, RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, Object factoryBean, final Method factoryMethod, Object[] args) {
try {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
ReflectionUtils.makeAccessible(factoryMethod);
return null;
}
});
} else {
ReflectionUtils.makeAccessible(factoryMethod);
}
// 如果factoryBean是null的话那么这个factoryMethod就必须是static的
return factoryMethod.invoke(factoryBean, args);
} catch (IllegalArgumentException ex) {
throw new BeanDefinitionStoreException("应用于工厂方法 [" + factoryMethod + "]的参数非法; " + "参数: "
+ StringUtils.arrayToCommaDelimitedString(args));
} catch (IllegalAccessException ex) {
throw new BeanDefinitionStoreException("方法 [" + factoryMethod + "]无法访问,你确定这个是public的吗?");
} catch (InvocationTargetException ex) {
throw new BeanDefinitionStoreException("调用工厂方法 [" + factoryMethod + "] 时发生异常", ex.getTargetException());
}
}
}