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()); } } }