1 package net.sourceforge.jparam.conversion.creators; 2 3 import java.lang.reflect.Method; 4 import java.lang.reflect.Modifier; 5 6 import net.sourceforge.jparam.util.Utils; 7 8 public class MethodCreator extends AbstractCreator { 9 10 boolean[] canArgBeNull; 11 12 Method m; 13 14 public static String getMethodValidError(Method m) { 15 if (!m.getName().startsWith("create")) 16 return "Creator method name must begin with \"create\", method: " 17 + m; 18 if (m.getReturnType().getClass().equals(void.class)) 19 return "Creator method must have a return type, method: " + m; 20 if (m.getReturnType().getClass().isPrimitive()) 21 return "Creator method must have a non-primitive return type, method: " 22 + m; 23 if (!Modifier.isStatic(m.getModifiers())) 24 return "Creator method must be static, method: " + m; 25 if (!Modifier.isPublic(m.getModifiers())) 26 return "Creator method must be public, method: " + m; 27 return null; 28 } 29 30 public MethodCreator(Method m) { 31 32 String validationError = getMethodValidError(m); 33 Utils.assert(validationError == null, validationError); 34 35 this.m = m; 36 this.returnType = m.getReturnType(); 37 this.parameterTypes = m.getParameterTypes(); 38 canArgBeNull = new boolean[parameterTypes.length]; 39 for (int i = 0; i < parameterTypes.length; i++) { 40 if (parameterTypes[i].isPrimitive()) { 41 canArgBeNull[i] = false; 42 parameterTypes[i] = ObjectCreator.getInstance() 43 .getNonPrimitiveClass(parameterTypes[i]); 44 45 } else { 46 canArgBeNull[i] = true; 47 } 48 } 49 } 50 51 protected Object internalCreate(Object[] parameters) throws Exception { 52 return m.invoke(null, parameters); 53 } 54 55 public static boolean isMethodValid(Method m) { 56 return getMethodValidError(m) == null; 57 } 58 59 protected boolean creatorEquals(ICreator o) { 60 MethodCreator other = (MethodCreator) o; 61 62 return m.equals(other.m); 63 } 64 65 public boolean canBeNull(int index) { 66 return canArgBeNull[index]; 67 } 68 69 }