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 }