Here you can find the source of newInstance(String className, Object... params)
Parameter | Description |
---|---|
className | a string with the entire class, eg. "java.lang.Integer" |
params | the constructor parameters |
public static Object newInstance(String className, Object... params) throws Exception
//package com.java2s; /*/*from w w w .ja v a2 s . c o m*/ * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * and the EPL 1.0 (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ import java.lang.reflect.Constructor; public class Main { /** * Creates a new instance. This will try to use the constructor where the * most parameter classes match exactly (this algorithm is simpler than the * one in the Java specification, but works well for most cases). * * @param className a string with the entire class, eg. "java.lang.Integer" * @param params the constructor parameters * @return the newly created object */ public static Object newInstance(String className, Object... params) throws Exception { Constructor<?> best = null; int bestMatch = 0; for (Constructor<?> c : Class.forName(className).getConstructors()) { int p = match(c.getParameterTypes(), params); if (p > bestMatch) { bestMatch = p; best = c; } } if (best == null) { throw new NoSuchMethodException(className); } return best.newInstance(params); } private static int match(Class<?>[] params, Object[] values) { int len = params.length; if (len == values.length) { int points = 1; for (int i = 0; i < len; i++) { Class<?> pc = getNonPrimitiveClass(params[i]); Object v = values[i]; Class<?> vc = v == null ? null : v.getClass(); if (pc == vc) { points++; } else if (vc == null) { // can't verify } else if (!pc.isAssignableFrom(vc)) { return 0; } } return points; } return 0; } /** * Convert primitive class names to java.lang.* class names. * * @param clazz the class (for example: int) * @return the non-primitive class (for example: java.lang.Integer) */ public static Class<?> getNonPrimitiveClass(Class<?> clazz) { if (!clazz.isPrimitive()) { return clazz; } else if (clazz == boolean.class) { return Boolean.class; } else if (clazz == byte.class) { return Byte.class; } else if (clazz == char.class) { return Character.class; } else if (clazz == double.class) { return Double.class; } else if (clazz == float.class) { return Float.class; } else if (clazz == int.class) { return Integer.class; } else if (clazz == long.class) { return Long.class; } else if (clazz == short.class) { return Short.class; } else if (clazz == void.class) { return Void.class; } return clazz; } }