View Javadoc

1   package org.astrogrid.common.creator;
2   
3   import java.lang.reflect.Constructor;
4   import java.lang.reflect.Field;
5   import java.lang.reflect.InvocationTargetException;
6   import java.lang.reflect.Modifier;
7   
8   import org.apache.log4j.Category;
9   
10  /***
11   * @author peter.shillan <mailto:gps@roe.ac.uk />
12   */
13  public class Creator {
14    private Category logger = Category.getInstance(getClass());
15  
16    public Object newInstance(String className) throws CreatorException {
17      return newInstance(className, null);
18    }
19    
20    public Object newInstance(String className, Object[] parameters) throws CreatorException {
21      Object result = null;
22      
23      try {
24        Class clazz = Class.forName(className);
25  
26        Class[] classes = getParameterClasses(parameters);
27        Constructor constructor = null;
28        try {
29          constructor = clazz.getConstructor(classes);
30        }
31        catch(NoSuchMethodException e) {
32          classes = convertPrimitives(classes);
33          constructor = clazz.getConstructor(classes);
34        }
35  
36        try {
37          result = constructor.newInstance(parameters);
38        }
39        catch(InstantiationException e) {
40          throw new CreatorException(e);
41        }
42        catch(IllegalAccessException e) {
43          throw new CreatorException(e);
44        }
45        catch(InvocationTargetException e) {
46          throw new CreatorException(e);
47        }
48      }
49      catch(ClassNotFoundException e) {
50        throw new CreatorException(e);
51      }
52      catch(NoSuchMethodException e) {
53        throw new CreatorException(e);
54      }
55      
56      return result;
57    }
58    
59    private Class[] getParameterClasses(Object[] parameters) {
60      Class[] result = null;
61      
62      if(parameters != null && parameters.length > 0) {
63        result = new Class[parameters.length];
64        for(int paramIndex = 0; paramIndex < parameters.length; paramIndex++) {
65          result[paramIndex] = parameters[paramIndex].getClass();
66        }
67      }    
68      
69      return result;
70    }
71    
72    private Class[] convertPrimitives(Class[] classes) {
73      Class[] result = null;
74      
75      if(classes != null && classes.length > 0) {
76        result = new Class[classes.length];
77        for(int classIndex = 0; classIndex < classes.length; classIndex++) {
78          result[classIndex] = convertPrimitive(classes[classIndex]);
79        }
80      }    
81      
82      return result;
83    }
84    
85    private Class convertPrimitive(Class clazz) {
86      Class result = clazz;
87      
88      logger.debug("class: " + clazz.getName());
89      
90      try {
91        Field field = clazz.getField("TYPE");
92        int modifiers = field.getModifiers();
93        if(Modifier.isStatic(modifiers)) {
94          Class fieldClazz = field.getType();
95  
96          if(fieldClazz.isAssignableFrom(Class.class)){
97            result = (Class) field.get(null);
98          }
99        }
100     }
101     catch(NoSuchFieldException e) {
102       logger.debug("no TYPE for class: " + result.getName());
103     }
104     catch(IllegalAccessException e) {
105       logger.debug("illegal access: " + result.getName());
106     }
107     
108     logger.debug("result: " + result.getName());
109     logger.debug("Integer.TYPE: " + Integer.TYPE.getName());
110 
111     return result;
112   }
113 
114 }